华西海圻ELN前端工程
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.

815 lines
28 KiB

  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
  4. <el-form-item :label="$t('page.system.role.name')+':'" prop="roleName">
  5. <el-input
  6. v-model="queryParams.roleName"
  7. :placeholder="$t('form.placeholderInput')"
  8. clearable
  9. style="width: 240px"
  10. @keyup.enter.native="handleQuery"
  11. />
  12. </el-form-item>
  13. <el-form-item :label="$t('page.system.role.key')+':'" prop="roleKey">
  14. <el-input
  15. v-model="queryParams.roleKey"
  16. :placeholder="$t('form.placeholderInput')"
  17. clearable
  18. style="width: 240px"
  19. @keyup.enter.native="handleQuery"
  20. />
  21. </el-form-item>
  22. <el-form-item :label="$t('page.system.role.status')+':'" prop="status">
  23. <el-select
  24. v-model="queryParams.status"
  25. :placeholder="$t('form.placeholderSelect')"
  26. clearable
  27. style="width: 240px"
  28. >
  29. <el-option key="0" :label="$t('page.system.role.statusEnable')" value="0" />
  30. <el-option key="1" :label="$t('page.system.role.statusDisable')" value="1" />
  31. </el-select>
  32. </el-form-item>
  33. <!-- <el-form-item label="创建时间">
  34. <el-date-picker
  35. v-model="dateRange"
  36. style="width: 240px"
  37. value-format="yyyy-MM-dd"
  38. type="daterange"
  39. range-separator="-"
  40. start-placeholder="开始日期"
  41. end-placeholder="结束日期"
  42. ></el-date-picker>
  43. </el-form-item> -->
  44. <el-form-item>
  45. <el-button type="primary" icon="el-icon-search" @click="handleQuery">{{$t('form.search')}}</el-button>
  46. <el-button icon="el-icon-refresh" @click="resetQuery">{{$t('form.reset')}}</el-button>
  47. </el-form-item>
  48. </el-form>
  49. <el-row :gutter="10" class="mb8">
  50. <el-col :span="1.5">
  51. <el-button
  52. type="primary"
  53. plain
  54. icon="el-icon-plus"
  55. @click="handleAdd"
  56. v-hasPermi="['system:role:add']"
  57. >{{$t('form.add')}}</el-button>
  58. </el-col>
  59. <el-col :span="1.5">
  60. <el-button
  61. type="warning"
  62. plain
  63. icon="el-icon-download"
  64. @click="handleExport"
  65. v-hasPermi="['system:role:export']"
  66. >{{$t('form.export')}}</el-button>
  67. </el-col>
  68. <!-- <el-col :span="1.5">
  69. <el-button
  70. type="success"
  71. plain
  72. icon="el-icon-edit"
  73. :disabled="single"
  74. @click="handleUpdate"
  75. v-hasPermi="['system:role:edit']"
  76. >修改</el-button>
  77. </el-col>
  78. <el-col :span="1.5">
  79. <el-button
  80. type="danger"
  81. plain
  82. icon="el-icon-delete"
  83. :disabled="multiple"
  84. @click="handleDelete"
  85. v-hasPermi="['system:role:remove']"
  86. >删除</el-button>
  87. </el-col>
  88. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> -->
  89. </el-row>
  90. <el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
  91. <!-- <el-table-column type="selection" width="55" align="center" /> -->
  92. <!-- <el-table-column label="角色编号" prop="roleId" width="120" /> -->
  93. <el-table-column :label="$t('page.system.role.name')" prop="roleName" :show-overflow-tooltip="true" width="250" />
  94. <el-table-column :label="$t('page.system.role.key')" prop="roleKey" :show-overflow-tooltip="true" width="250" />
  95. <el-table-column :label="$t('page.system.role.remark')" prop="remark" :show-overflow-tooltip="true" />
  96. <!-- <el-table-column label="显示顺序" prop="roleSort" width="100" /> -->
  97. <el-table-column :label="$t('page.system.role.status')" prop="status" :show-overflow-tooltip="true" width="150">
  98. <template slot-scope="scope">
  99. <span v-if="scope.row.status==='0'">{{$t('page.system.role.statusEnable')}}</span>
  100. <span v-if="scope.row.status==='1'">{{$t('page.system.role.statusDisable')}}</span>
  101. </template>
  102. </el-table-column>
  103. <!-- <el-table-column label="状态" align="center" width="100">
  104. <template slot-scope="scope">
  105. <el-switch
  106. v-model="scope.row.status"
  107. active-value="0"
  108. inactive-value="1"
  109. @change="handleStatusChange(scope.row)"
  110. ></el-switch>
  111. </template>
  112. </el-table-column>
  113. <el-table-column label="创建时间" align="center" prop="createTime" width="180">
  114. <template slot-scope="scope">
  115. <span>{{ parseTime(scope.row.createTime) }}</span>
  116. </template>
  117. </el-table-column> -->
  118. <el-table-column :label="$t('form.operate')" align="center" class-name="small-padding fixed-width" width="200">
  119. <template slot-scope="scope" v-if="scope.row.roleId !== 1">
  120. <el-button
  121. type="text"
  122. @click="handleUpdate(scope.row,false)"
  123. v-hasPermi="['system:role:edit']"
  124. >{{$t('page.system.role.edit')}}</el-button>
  125. <el-button
  126. type="text"
  127. @click="handleStatusChange(scope.row)"
  128. v-hasPermi="['system:role:enable']"
  129. v-if="scope.row.status==='0'"
  130. >{{$t('page.system.role.disable')}}</el-button>
  131. <el-button
  132. type="text"
  133. @click="handleStatusChange(scope.row)"
  134. v-hasPermi="['system:role:enable']"
  135. v-if="scope.row.status==='1'"
  136. >{{$t('page.system.role.enable')}}</el-button>
  137. <el-button
  138. type="text"
  139. @click="transfer(scope.row)"
  140. v-hasPermi="['system:role:allocate']"
  141. v-if="scope.row.status==='0'"
  142. >{{$t('page.system.role.allocate')}}</el-button>
  143. <el-button
  144. v-hasPermi="['system:role:detail']"
  145. type="text"
  146. @click="handleUpdate(scope.row,true)"
  147. >{{$t('page.system.role.detail')}}</el-button>
  148. <!-- <el-button
  149. type="text"
  150. @click="handleDelete(scope.row)"
  151. v-hasPermi="['system:role:remove']"
  152. >删除</el-button>
  153. <el-dropdown @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
  154. <el-button type="text" icon="el-icon-d-arrow-right">更多</el-button>
  155. <el-dropdown-menu slot="dropdown">
  156. <el-dropdown-item command="handleDataScope" icon="el-icon-circle-check"
  157. v-hasPermi="['system:role:edit']">数据权限</el-dropdown-item>
  158. <el-dropdown-item command="handleAuthUser" icon="el-icon-user"
  159. v-hasPermi="['system:role:edit']">分配用户</el-dropdown-item>
  160. </el-dropdown-menu>
  161. </el-dropdown> -->
  162. <!-- <el-dropdown @command="(command) => handleCommand(command, scope.row)" v-hasPermi="['system:role:edit']">
  163. <el-button type="text" icon="el-icon-d-arrow-right">更多</el-button>
  164. <el-dropdown-menu slot="dropdown">
  165. <el-dropdown-item command="handleDataScope" icon="el-icon-circle-check"
  166. v-hasPermi="['system:role:edit']">数据权限</el-dropdown-item>
  167. <el-dropdown-item command="handleAuthUser" icon="el-icon-user"
  168. v-hasPermi="['system:role:edit']">分配用户</el-dropdown-item>
  169. </el-dropdown-menu>
  170. </el-dropdown> -->
  171. </template>
  172. </el-table-column>
  173. </el-table>
  174. <pagination
  175. v-show="total>0"
  176. :total="total"
  177. :page.sync="queryParams.pageNum"
  178. :limit.sync="queryParams.pageSize"
  179. @pagination="getList"
  180. />
  181. <!-- 添加或修改角色配置对话框 -->
  182. <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :title="title" :visible.sync="open" width="800px" append-to-body>
  183. <el-form ref="form" :model="form" :rules="rules" label-width="150px">
  184. <el-form-item :label="$t('page.system.role.name')+':'" prop="roleName">
  185. <el-input v-model="form.roleName" :placeholder="$t('form.placeholderInput')" :readonly="readonly" />
  186. </el-form-item>
  187. <el-form-item prop="roleKey">
  188. <span slot="label">
  189. <!-- <el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
  190. <i class="el-icon-question"></i>
  191. </el-tooltip> -->
  192. {{$t('page.system.role.key')}}
  193. </span>
  194. <el-input v-model="form.roleKey" :placeholder="$t('form.placeholderInput')" :readonly="readonly" />
  195. </el-form-item>
  196. <!-- <el-form-item label="角色顺序" prop="roleSort">
  197. <el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
  198. </el-form-item> -->
  199. <el-form-item :label="$t('page.system.role.status')+':'" prop="status">
  200. <el-select
  201. v-model="form.status"
  202. :placeholder="$t('form.placeholderSelect')"
  203. style="width:100%"
  204. :disabled="readonly"
  205. >
  206. <el-option key="0" :label="$t('page.system.role.statusEnable')" value="0" />
  207. <el-option key="1" :label="$t('page.system.role.statusDisable')" value="1" />
  208. </el-select>
  209. </el-form-item>
  210. <el-form-item :label="$t('page.system.role.remark')+':'">
  211. <el-input v-model="form.remark" type="textarea" :placeholder="$t('form.placeholderSelect')" :readonly="readonly" :maxlength="200" show-word-limit></el-input>
  212. </el-form-item>
  213. <el-form-item :label="$t('page.system.role.permit')+':'">
  214. <!-- <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
  215. <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
  216. <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox> -->
  217. <el-tree
  218. class="tree-border"
  219. :data="menuOptions"
  220. show-checkbox
  221. ref="menu"
  222. node-key="id"
  223. :check-strictly="false"
  224. empty-text="loading"
  225. :props="defaultProps"
  226. ></el-tree>
  227. </el-form-item>
  228. </el-form>
  229. <div slot="footer" class="dialog-footer" v-if="!readonly">
  230. <el-button type="primary" @click="submitForm">{{$t('form.saveConfirm')}}</el-button>
  231. <el-button @click="cancel">{{$t('form.cancel')}}</el-button>
  232. </div>
  233. </el-dialog>
  234. <!-- 分配角色数据权限对话框 -->
  235. <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :title="title" :visible.sync="openDataScope" width="500px" append-to-body>
  236. <el-form :model="form" label-width="80px">
  237. <el-form-item label="角色名称">
  238. <el-input v-model="form.roleName" :disabled="true" />
  239. </el-form-item>
  240. <el-form-item label="权限字符">
  241. <el-input v-model="form.roleKey" :disabled="true" />
  242. </el-form-item>
  243. <el-form-item label="权限范围">
  244. <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
  245. <el-option
  246. v-for="item in dataScopeOptions"
  247. :key="item.value"
  248. :label="item.label"
  249. :value="item.value"
  250. ></el-option>
  251. </el-select>
  252. </el-form-item>
  253. <el-form-item label="数据权限" v-show="form.dataScope == 2">
  254. <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
  255. <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
  256. <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
  257. <el-tree
  258. class="tree-border"
  259. :data="deptOptions"
  260. show-checkbox
  261. default-expand-all
  262. ref="dept"
  263. node-key="id"
  264. :check-strictly="!form.deptCheckStrictly"
  265. empty-text="加载中,请稍候"
  266. :props="defaultProps"
  267. ></el-tree>
  268. </el-form-item>
  269. </el-form>
  270. <div slot="footer" class="dialog-footer">
  271. <el-button type="primary" @click="submitDataScope"> </el-button>
  272. <el-button @click="cancelDataScope"> </el-button>
  273. </div>
  274. </el-dialog>
  275. <!-- 分配角色数据权限对话框 -->
  276. <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :title="transferDialog.title" :visible.sync="transferDialog.visible" width="750px" append-to-body>
  277. <el-transfer class="role-transfer" v-model="transferDialog.selected" :data="transferDialog.list" :titles="[$t('page.system.role.unauthorized'), $t('page.system.role.authorized')]"
  278. filterable
  279. :filter-method="filterMethod"
  280. :filter-placeholder="$t('page.system.role.filterPlaceholder')">
  281. </el-transfer>
  282. <div slot="footer" class="dialog-footer">
  283. <el-button type="primary" @click="changRoleUser">{{$t('form.saveConfirm')}}</el-button>
  284. <el-button @click="transferDialog.visible = false">{{$t('form.cancel')}}</el-button>
  285. </div>
  286. </el-dialog>
  287. <Sign ref="signRef" @callback="doSign" />
  288. </div>
  289. </template>
  290. <script>
  291. import { listRole, getRole, delRole, addRole, updateRole, dataScope, changeRoleStatus, deptTreeSelect,allocatedUserList,authUserSetAll } from "@/api/system/role"
  292. import { treeselect as menuTreeselect, roleMenuTreeselect } from "@/api/system/menu"
  293. import Sign from '@/views/business/study/comp/sign.vue'
  294. export default {
  295. name: "Role",
  296. dicts: ['sys_normal_disable'],
  297. components:{Sign},
  298. data() {
  299. return {
  300. // 遮罩层
  301. loading: true,
  302. // 选中数组
  303. ids: [],
  304. // 非单个禁用
  305. single: true,
  306. // 非多个禁用
  307. multiple: true,
  308. // 显示搜索条件
  309. showSearch: true,
  310. // 总条数
  311. total: 0,
  312. // 角色表格数据
  313. roleList: [],
  314. // 弹出层标题
  315. title: "",
  316. // 是否显示弹出层
  317. open: false,
  318. // 是否显示弹出层(数据权限)
  319. openDataScope: false,
  320. menuExpand: false,
  321. menuNodeAll: false,
  322. deptExpand: true,
  323. deptNodeAll: false,
  324. // 日期范围
  325. dateRange: [],
  326. // 数据范围选项
  327. dataScopeOptions: [
  328. {
  329. value: "1",
  330. label: "全部数据权限"
  331. },
  332. {
  333. value: "2",
  334. label: "自定数据权限"
  335. },
  336. {
  337. value: "3",
  338. label: "本部门数据权限"
  339. },
  340. {
  341. value: "4",
  342. label: "本部门及以下数据权限"
  343. },
  344. {
  345. value: "5",
  346. label: "仅本人数据权限"
  347. }
  348. ],
  349. // 菜单列表
  350. menuOptions: [],
  351. // 部门列表
  352. deptOptions: [],
  353. // 查询参数
  354. queryParams: {
  355. pageNum: 1,
  356. pageSize: 10,
  357. roleName: undefined,
  358. roleKey: undefined,
  359. status: undefined
  360. },
  361. // 表单参数
  362. form: {},
  363. defaultProps: {
  364. children: "children",
  365. label: "label"
  366. },
  367. // 表单校验
  368. rules: {
  369. roleName: [
  370. { required: true, message: this.$t('form.placeholderInput'), trigger: "blur" }
  371. ],
  372. roleKey: [
  373. { required: true, message: this.$t('form.placeholderInput'), trigger: "blur" }
  374. ],
  375. status: [
  376. { required: true, message: this.$t('form.placeholderSelect'), trigger: "change" }
  377. ],
  378. },
  379. readonly:false,
  380. transferDialog:{
  381. title:this.$t('page.system.role.allocate'),
  382. visible:false,
  383. list:[],
  384. selected:[],
  385. roleId:'',
  386. oldIdList:[]
  387. },
  388. operate:'',
  389. currRow:{}
  390. }
  391. },
  392. created() {
  393. this.getList()
  394. },
  395. methods: {
  396. /** 查询角色列表 */
  397. getList() {
  398. this.loading = true
  399. listRole(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
  400. this.roleList = response.rows
  401. this.total = response.total
  402. this.loading = false
  403. }
  404. )
  405. },
  406. /** 查询菜单树结构 */
  407. getMenuTreeselect() {
  408. menuTreeselect().then(response => {
  409. this.menuOptions = response.data
  410. })
  411. },
  412. // 所有菜单节点数据
  413. getMenuAllCheckedKeys() {
  414. // 目前被选中的菜单节点
  415. let checkedKeys = this.$refs.menu.getCheckedKeys()
  416. // 半选中的菜单节点
  417. let halfCheckedKeys = this.$refs.menu.getHalfCheckedKeys()
  418. checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
  419. return checkedKeys
  420. },
  421. // 所有部门节点数据
  422. getDeptAllCheckedKeys() {
  423. // 目前被选中的部门节点
  424. let checkedKeys = this.$refs.dept.getCheckedKeys()
  425. // 半选中的部门节点
  426. let halfCheckedKeys = this.$refs.dept.getHalfCheckedKeys()
  427. checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys)
  428. return checkedKeys
  429. },
  430. /** 根据角色ID查询菜单树结构 */
  431. getRoleMenuTreeselect(roleId) {
  432. return roleMenuTreeselect(roleId).then(response => {
  433. this.menuOptions = response.menus
  434. this.setDisabled(this.menuOptions)
  435. return response
  436. })
  437. },
  438. setDisabled(arr) {
  439. for (var i = 0; i < arr.length; i++) {
  440. arr[i]['disabled'] = this.readonly
  441. if (arr[i].children && arr[i].children.length > 0) {
  442. this.setDisabled(arr[i].children)
  443. }
  444. }
  445. },
  446. /** 根据角色ID查询部门树结构 */
  447. getDeptTree(roleId) {
  448. return deptTreeSelect(roleId).then(response => {
  449. this.deptOptions = response.depts
  450. return response
  451. })
  452. },
  453. // 角色状态修改
  454. handleStatusChange(row) {
  455. this.operate = "disable"
  456. this.currRow = row
  457. this.$refs.signRef.show(
  458. row.status === "0"?this.$t('page.system.role.disable'):this.$t('page.system.role.enable'),
  459. row.status === "0"?this.$t('page.system.role.disable'):this.$t('page.system.role.enable'),
  460. )
  461. },
  462. // 角色状态修改
  463. doHandleStatusChange(sign) {
  464. this.$modal.loading()
  465. let row = this.currRow
  466. changeRoleStatus({role:{roleId:row.roleId, status:row.status === "0"?'1':'0'},sign:sign}).then(response => {
  467. this.$refs.signRef.cancel()
  468. this.getList()
  469. }).finally(()=>{
  470. this.$modal.closeLoading()
  471. })
  472. // let text = row.status === "0" ? "启用" : "停用"
  473. // this.$modal.confirm('确认要"' + text + '""' + row.roleName + '"角色吗?').then(function() {
  474. // return changeRoleStatus(row.roleId, row.status)
  475. // }).then(() => {
  476. // this.$modal.msgSuccess(text + "成功")
  477. // }).catch(function() {
  478. // row.status = row.status === "0" ? "1" : "0"
  479. // })
  480. },
  481. // 取消按钮
  482. cancel() {
  483. this.open = false
  484. this.reset()
  485. },
  486. // 取消按钮(数据权限)
  487. cancelDataScope() {
  488. this.openDataScope = false
  489. this.reset()
  490. },
  491. // 表单重置
  492. reset() {
  493. if (this.$refs.menu != undefined) {
  494. this.$refs.menu.setCheckedKeys([])
  495. }
  496. this.menuExpand = false,
  497. this.menuNodeAll = false,
  498. this.deptExpand = true,
  499. this.deptNodeAll = false,
  500. this.form = {
  501. roleId: undefined,
  502. roleName: undefined,
  503. roleKey: undefined,
  504. roleSort: 0,
  505. status: "0",
  506. menuIds: [],
  507. deptIds: [],
  508. menuCheckStrictly: true,
  509. deptCheckStrictly: true,
  510. remark: undefined
  511. }
  512. this.resetForm("form")
  513. },
  514. /** 搜索按钮操作 */
  515. handleQuery() {
  516. this.queryParams.pageNum = 1
  517. this.getList()
  518. },
  519. /** 重置按钮操作 */
  520. resetQuery() {
  521. this.dateRange = []
  522. this.resetForm("queryForm")
  523. this.handleQuery()
  524. },
  525. // 多选框选中数据
  526. handleSelectionChange(selection) {
  527. this.ids = selection.map(item => item.roleId)
  528. this.single = selection.length!=1
  529. this.multiple = !selection.length
  530. },
  531. // 更多操作触发
  532. handleCommand(command, row) {
  533. switch (command) {
  534. case "handleDataScope":
  535. this.handleDataScope(row)
  536. break
  537. case "handleAuthUser":
  538. this.handleAuthUser(row)
  539. break
  540. default:
  541. break
  542. }
  543. },
  544. // 树权限(展开/折叠)
  545. handleCheckedTreeExpand(value, type) {
  546. if (type == 'menu') {
  547. let treeList = this.menuOptions
  548. for (let i = 0; i < treeList.length; i++) {
  549. this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value
  550. }
  551. } else if (type == 'dept') {
  552. let treeList = this.deptOptions
  553. for (let i = 0; i < treeList.length; i++) {
  554. this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value
  555. }
  556. }
  557. },
  558. // 树权限(全选/全不选)
  559. handleCheckedTreeNodeAll(value, type) {
  560. if (type == 'menu') {
  561. this.$refs.menu.setCheckedNodes(value ? this.menuOptions: [])
  562. } else if (type == 'dept') {
  563. this.$refs.dept.setCheckedNodes(value ? this.deptOptions: [])
  564. }
  565. },
  566. // 树权限(父子联动)
  567. handleCheckedTreeConnect(value, type) {
  568. if (type == 'menu') {
  569. this.form.menuCheckStrictly = value ? true: false
  570. } else if (type == 'dept') {
  571. this.form.deptCheckStrictly = value ? true: false
  572. }
  573. },
  574. /** 新增按钮操作 */
  575. handleAdd() {
  576. this.readonly = false
  577. this.reset()
  578. this.getMenuTreeselect()
  579. this.open = true
  580. this.title = this.$t('page.system.role.addRole')
  581. },
  582. /** 修改按钮操作 */
  583. handleUpdate(row,readonly) {
  584. this.readonly = readonly
  585. if(readonly){
  586. this.saveSimpleLog({name:row.roleName,nameEn:row.roleName,jcmc:'角色详情',jcmcEn:'Role Detail'})
  587. }
  588. this.reset()
  589. const roleId = row.roleId || this.ids
  590. const roleMenu = this.getRoleMenuTreeselect(roleId)
  591. getRole(roleId).then(response => {
  592. this.form = response.data
  593. this.open = true
  594. this.$nextTick(() => {
  595. roleMenu.then(res => {
  596. let checkedKeys = res.checkedKeys
  597. checkedKeys.forEach((v) => {
  598. this.$nextTick(()=>{
  599. this.$refs.menu.setChecked(v, true ,false)
  600. })
  601. })
  602. })
  603. })
  604. })
  605. this.title = readonly? this.$t('form.detail'): this.$t('page.system.role.modifyRole')
  606. },
  607. /** 选择角色权限范围触发 */
  608. dataScopeSelectChange(value) {
  609. if(value !== '2') {
  610. this.$refs.dept.setCheckedKeys([])
  611. }
  612. },
  613. /** 分配数据权限操作 */
  614. handleDataScope(row) {
  615. this.reset()
  616. const deptTreeSelect = this.getDeptTree(row.roleId)
  617. getRole(row.roleId).then(response => {
  618. this.form = response.data
  619. this.openDataScope = true
  620. this.$nextTick(() => {
  621. deptTreeSelect.then(res => {
  622. this.$refs.dept.setCheckedKeys(res.checkedKeys)
  623. })
  624. })
  625. })
  626. this.title = "分配数据权限"
  627. },
  628. /** 分配用户操作 */
  629. handleAuthUser: function(row) {
  630. const roleId = row.roleId
  631. this.$router.push("/system/role-auth/user/" + roleId)
  632. },
  633. /** 提交按钮 */
  634. submitForm: function() {
  635. this.$refs["form"].validate(valid => {
  636. if (valid) {
  637. if (this.form.roleId != undefined) {
  638. this.form.menuIds = this.getMenuAllCheckedKeys()
  639. this.operate = "update"
  640. this.$refs.signRef.show(
  641. this.$t('page.system.role.modifyRole'),
  642. this.$t('page.system.role.modifyRole'),
  643. )
  644. } else {
  645. this.form.menuIds = this.getMenuAllCheckedKeys()
  646. this.operate = "add"
  647. this.$refs.signRef.show(
  648. this.$t('page.system.role.addRole'),
  649. this.$t('page.system.role.addRole'),
  650. )
  651. }
  652. }
  653. })
  654. },
  655. doAdd(sign){
  656. this.$modal.loading()
  657. addRole({role:this.form,sign:sign}).then(response => {
  658. this.$refs.signRef.cancel()
  659. this.open = false
  660. this.getList()
  661. }).finally(()=>{
  662. this.$modal.closeLoading()
  663. })
  664. },
  665. doUpdate(sign){
  666. this.$modal.loading()
  667. updateRole({role:this.form,sign:sign}).then(response => {
  668. this.$refs.signRef.cancel()
  669. this.open = false
  670. this.getList()
  671. }).finally(()=>{
  672. this.$modal.closeLoading()
  673. })
  674. },
  675. /** 提交按钮(数据权限) */
  676. submitDataScope: function() {
  677. if (this.form.roleId != undefined) {
  678. this.form.deptIds = this.getDeptAllCheckedKeys()
  679. dataScope(this.form).then(response => {
  680. this.$modal.msgSuccess("修改成功")
  681. this.openDataScope = false
  682. this.getList()
  683. })
  684. }
  685. },
  686. /** 删除按钮操作 */
  687. handleDelete(row) {
  688. const roleIds = row.roleId || this.ids
  689. this.$modal.confirm(this.$t('form.confirmDelete')).then(function() {
  690. return delRole(roleIds)
  691. }).then(() => {
  692. this.getList()
  693. }).catch(() => {})
  694. },
  695. /** 导出按钮操作 */
  696. handleExport() {
  697. this.saveSimpleLog({name:'',nameEn:'',jcmc:'角色导出',jcmcEn:'Role Export'})
  698. this.download('system/role/export', {
  699. ...this.queryParams
  700. }, `role_${new Date().getTime()}.xlsx`)
  701. },
  702. transfer(row){
  703. allocatedUserList({roleId:row.roleId}).then(response => {
  704. let list = []
  705. _.forEach(response.list,(item)=>{
  706. list.push({
  707. key:item.userId,
  708. label:`${item.nickName}(${item.userName})`
  709. })
  710. })
  711. this.transferDialog.selected = response.selected
  712. this.transferDialog.list = list
  713. this.transferDialog.roleId = row.roleId
  714. this.transferDialog.oldIdList = _.cloneDeep(response.selected)
  715. this.transferDialog.visible = true
  716. }
  717. )
  718. },
  719. filterMethod(query, item){
  720. return item.label.indexOf(query) > -1;
  721. },
  722. changRoleUser(){
  723. let update = false
  724. let userIdList = this.transferDialog.selected && this.transferDialog.selected.length>0 ? this.transferDialog.selected:[]
  725. if(this.transferDialog.oldIdList.length!==userIdList.length){
  726. update = true
  727. }else{
  728. for(let i=0;i<this.transferDialog.oldIdList.length;i++){
  729. if(_.findIndex(userIdList,o=>{return o===this.transferDialog.oldIdList[i]})==-1){
  730. update = true
  731. break
  732. }
  733. }
  734. }
  735. if(update){
  736. this.operate = 'allocated'
  737. this.$refs.signRef.show(
  738. this.$t('page.system.role.fpjs'),
  739. this.$t('page.system.role.fpjs'),
  740. )
  741. }else{
  742. this.transferDialog.visible = false
  743. }
  744. },
  745. doChangRoleUser(sign){
  746. this.$modal.loading()
  747. authUserSetAll({ roleId: this.transferDialog.roleId, userIdList: this.transferDialog.selected && this.transferDialog.selected.length>0 ? this.transferDialog.selected:[] ,sign:sign}).then(res => {
  748. this.$refs.signRef.cancel()
  749. this.transferDialog.visible = false
  750. }).finally(()=>{
  751. this.$modal.closeLoading()
  752. })
  753. },
  754. doSign(val){
  755. if(this.operate==='update'){
  756. this.doUpdate(val)
  757. }
  758. if(this.operate==='add'){
  759. this.doAdd(val)
  760. }
  761. if(this.operate==='disable'){
  762. this.doHandleStatusChange(val)
  763. }
  764. if(this.operate==='allocated'){
  765. this.doChangRoleUser(val)
  766. }
  767. },
  768. }
  769. }
  770. </script>
  771. <style lang="scss">
  772. .role-transfer{
  773. .el-transfer-panel{
  774. width: 250px;
  775. }
  776. }
  777. </style>