User.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. <template>
  2. <div>
  3. <el-main ref="elMain" style="padding: 0px;">
  4. <Split :gutterSize="2" style="height: calc(100vh - 120px);">
  5. <!-- 左侧树Start -->
  6. <SplitArea :size="leftSplitWidth" :minSize="240">
  7. <div>
  8. <el-checkbox v-model="containsSubDeptChecked">包含下级机构</el-checkbox>
  9. <el-divider></el-divider>
  10. <tree :setting="ztreeSetting" :nodes="ztreeNodes" @onClick="onZTreeClick" @onCreated="onZTreeCreated" />
  11. </div>
  12. </SplitArea>
  13. <!-- 左侧树End -->
  14. <!-- 右侧列表页面Start -->
  15. <SplitArea :size="rightSplitWidth">
  16. <!-- 筛选区域Start -->
  17. <el-row class="queryFrom">
  18. <el-form ref="queryFormRef" :model="queryFrom" label-width="80px">
  19. <el-row>
  20. <!-- <el-col :span="5">
  21. <el-form-item label="工号">
  22. <el-input clearable size="small" placeholder="工号" v-model="queryFrom.id" ></el-input>
  23. </el-form-item>
  24. </el-col> -->
  25. <el-col :span="5">
  26. <el-form-item label="姓名">
  27. <el-input clearable size="small" placeholder="姓名" v-model="queryFrom.name"></el-input>
  28. </el-form-item>
  29. </el-col>
  30. <el-col :span="5">
  31. <el-form-item label="手机号">
  32. <el-input clearable size="small" placeholder="手机号" v-model="queryFrom.tel"></el-input>
  33. </el-form-item>
  34. </el-col>
  35. <el-col :span="4" style="display: flex;align-items: center;justify-content: center;">
  36. <kt-button label="查询" perms="sys:role:query" @click="queryStaffInfo" />
  37. </el-col>
  38. </el-row>
  39. </el-form>
  40. </el-row>
  41. <!-- 筛选区域End -->
  42. <!-- 审核通过 -->
  43. <!-- <template v-if="pageRequest.columnFilters.status.value == '1'"> -->
  44. <kt-common-table permsEdit="sys:role:update" :data="pageResult" :columns="columns" editButtonName="配置角色"
  45. :showBatchDelete="false" @findPage="findPage" @handleEdit="handleTableEdit">
  46. </kt-common-table>
  47. <!-- </template> -->
  48. </SplitArea>
  49. <!-- 右侧列表页面End -->
  50. </Split>
  51. </el-main>
  52. <!-- 新增修改界面 -->
  53. <el-dialog title="角色配置" width="800px" :visible.sync="dialogVisible" :close-on-click-modal="false"
  54. :before-close="handleDialogBefore" @close="closeDialog" v-dialogDrag>
  55. <el-form :model="dataForm" ref="dataForm" @keyup.enter.native="submitForm()" label-width="120px" size="small"
  56. style="text-align:left;">
  57. <el-tabs>
  58. <el-row>
  59. <el-col :span="12">
  60. <el-form-item label="部门编码" prop="name">
  61. <el-input disabled v-model="dataForm.deptId"></el-input>
  62. </el-form-item>
  63. </el-col>
  64. <el-col :span="12">
  65. <el-form-item label="部门名称" prop="name">
  66. <el-input disabled v-model="dataForm.deptName"></el-input>
  67. </el-form-item>
  68. </el-col>
  69. </el-row>
  70. <el-row>
  71. <el-col :span="12">
  72. <el-form-item label="员工工号" prop="id">
  73. <el-input disabled v-model="dataForm.id"></el-input>
  74. </el-form-item>
  75. </el-col>
  76. <el-col :span="12">
  77. <el-form-item label="姓名" prop="name">
  78. <el-input disabled v-model="dataForm.name"></el-input>
  79. </el-form-item>
  80. </el-col>
  81. </el-row>
  82. <el-row>
  83. <el-col :span="12">
  84. <el-form-item label="邮箱" prop="email">
  85. <el-input disabled v-model="dataForm.email"></el-input>
  86. </el-form-item>
  87. </el-col>
  88. <el-col :span="12">
  89. <el-form-item label="电话" prop="mobile">
  90. <el-input disabled v-model="dataForm.mobile"></el-input>
  91. </el-form-item>
  92. </el-col>
  93. </el-row>
  94. <el-row>
  95. <el-col :span="12">
  96. <el-form-item label="角色权限" prop="roleId">
  97. <el-select size="small" clearable v-model="dataForm.roleId" placeholder="请选择" @change="changeRole($event)">
  98. <el-option :label="roleItem.name" :value="roleItem.id" v-for="(roleItem, roleIndex) in roleoptions"
  99. :key="roleIndex"></el-option>
  100. </el-select>
  101. </el-form-item>
  102. </el-col>
  103. <el-col :span="12">
  104. <el-form-item label="树权限" prop="showLevel">
  105. <el-select size="small" clearable v-model="dataForm.showLevel" placeholder="请选择">
  106. <el-option v-for="(val, index) in treeOptions" :label="val.dictTag" :value="val.dictValue"
  107. :key="index"></el-option>
  108. </el-select>
  109. </el-form-item>
  110. </el-col>
  111. <el-col :span="12">
  112. <el-form-item label="拨号权限" prop="isDial">
  113. <el-select size="small" clearable v-model="dataForm.isDial" placeholder="请选择" @change="refreshData">
  114. <el-option v-for="(val, index) in isDialOptions" :label="val.label" :value="val.value"
  115. :key="index"></el-option>
  116. </el-select>
  117. </el-form-item>
  118. </el-col>
  119. <el-col :span="12">
  120. <el-form-item label="拨号权限账号" prop="dialUserName">
  121. <el-input v-model="dataForm.dialUserName"></el-input>
  122. </el-form-item>
  123. </el-col>
  124. <el-col :span="12">
  125. <el-form-item label="拨号权限密码" prop="dialPassWord">
  126. <el-input v-model="dataForm.dialPassWord"></el-input>
  127. </el-form-item>
  128. </el-col>
  129. </el-row>
  130. </el-tabs>
  131. </el-form>
  132. <span slot="footer" class="dialog-footer">
  133. <el-button size="small" @click="closeDialog">取消</el-button>
  134. <el-button size="small" type="primary" @click="submitForm">提交</el-button>
  135. </span>
  136. </el-dialog>
  137. </div>
  138. </template>
  139. <script>
  140. import Cookies from "js-cookie"
  141. import KtButton from "@/views/Core/KtButton"; // 按钮权限组件
  142. import tree from "@/components/ztree.vue"; // 机构树组件
  143. import KtCommonTable from "@/views/Core/KtCommonTable.vue";//表格组件
  144. import CommonUtil from "@/utils/comutil.js"
  145. export default {
  146. components: {
  147. KtButton,
  148. tree,
  149. KtCommonTable
  150. },
  151. data() {
  152. return {
  153. peopleid: "",
  154. peopledeptid: "",
  155. /**Split 开始 */
  156. leftSplitWidth: 20,
  157. rightSplitWidth: 80,
  158. /**Split 结束 */
  159. //----ztreeLeft begin---------
  160. containsSubDeptChecked: true, //是否包含下级机构
  161. ztreeObj: null,
  162. ztreeSetting: {
  163. check: {
  164. enable: false
  165. },
  166. data: {
  167. simpleData: {
  168. enable: true,
  169. pIdKey: "parentId"
  170. }
  171. },
  172. view: {
  173. showIcon: false
  174. }
  175. },
  176. ztreeNodes: [],
  177. currentTreeNode: null,
  178. //----ztreeLeft end---------
  179. // 右侧列表查询数据Start
  180. queryFrom: {},
  181. pageResult: {},
  182. pageRequest: { //查询的默认条件
  183. pageNum: 1,
  184. pageSize: 20,
  185. columnFilters: {
  186. "deptid": {
  187. "name": "deptid",
  188. "value": ''
  189. },
  190. "containsSubDept": {
  191. "name": "containsSubDept",
  192. "value": 1
  193. },
  194. "usertype": {
  195. "name": "usertype",
  196. "value": "A"
  197. },
  198. "status": {
  199. "name": "status",
  200. "value": "1"
  201. },
  202. "id": {
  203. "name": "id",
  204. "value": ""
  205. },
  206. "name": {
  207. "name": "name",
  208. "value": ""
  209. },
  210. "mobile": {
  211. "name": "mobile",
  212. "value": ""
  213. }
  214. }
  215. },
  216. columns: [ // 数据列
  217. { prop: "deptId", label: "部门编码", minWidth: 80, sortable: false },
  218. { prop: "deptName", label: "部门名称", minWidth: 80, sortable: false },
  219. // { prop: "jobCode",label: "岗位",minWidth: 80,sortable: false,formatter: this.jobcodeFormatter},
  220. { prop: "id", label: "工号", minWidth: 80, sortable: false },
  221. { prop: "name", label: "姓名", minWidth: 80, sortable: false },
  222. // { prop: "sex",label: "性别",minWidth: 80,sortable: false,formatter: this.sexFormatter},
  223. { prop: "mobile", label: "联系电话", minWidth: 100, sortable: false },
  224. { prop: "email", label: "邮箱", minWidth: 100, sortable: false },
  225. { prop: "roleName", label: "角色", minWidth: 100, sortable: false }
  226. ],
  227. // 右侧列表查询数据End
  228. // 新增或修改的弹出框Start
  229. dialogVisible: false, // 新增编辑界面是否显示
  230. dataForm: { // 人员个人信息
  231. remark: "",
  232. roleId: "",
  233. dialUserName:"",
  234. dialPassWord:"",
  235. isDial:"0",
  236. },
  237. // 新增或修改的弹出框End
  238. roleoptions: [],
  239. treeOptions:[],
  240. isDialOptions:[
  241. {
  242. label:'关闭',
  243. value:'0'
  244. },{
  245. label:'开启',
  246. value:'1'
  247. },
  248. ]
  249. }
  250. },
  251. created() {
  252. this.peopleid = Cookies.get('user');
  253. if (this.peopleid != 'admin') {
  254. this.peopledeptid = Cookies.get('user').split('D')[0];
  255. this.pageRequest.columnFilters.deptid.value = this.peopledeptid;
  256. } else {
  257. this.peopledeptid = '9';
  258. this.pageRequest.columnFilters.deptid.value = this.peopledeptid;
  259. }
  260. //获取所有下拉框数据(字典)
  261. this.getRoles();
  262. this.dictList()
  263. },
  264. mounted() {
  265. this.findLeftTreeData();// 获取机构树的数据
  266. //用像素初始化左边的split的宽度
  267. this.changeTreeWidth(240);// 初始化树的宽度
  268. },
  269. watch: {
  270. containsSubDeptChecked() { // 监听是否包含下级
  271. this.pageRequest.columnFilters.containsSubDept.value = this.containsSubDeptChecked ? "1" : "0";
  272. this.findPage();
  273. }
  274. },
  275. methods: {
  276. refreshData (val) {
  277. this.$forceUpdate()
  278. },
  279. dictList(data) {
  280. this.$api.dict
  281. .dictList()
  282. .then((res) => {
  283. let dataArr = res.filter((item) => {
  284. return item.dictType == "treeShowLevelEnum";
  285. });
  286. dataArr.length > 0 ? (this.treeOptions = dataArr[0].ddList) : "";
  287. })
  288. .then(data != null ? data.callback : "");
  289. },
  290. getRoles() {
  291. this.$api.role.findAll().then((res) => {
  292. this.roleoptions = res.data
  293. }).catch((error) => {
  294. this.roleoptions = [];
  295. })
  296. },
  297. changeRole(roleid) {
  298. this.dataForm.roleId = roleid;
  299. },
  300. /**Split 开始 */
  301. changeTreeWidth(widthVal) {
  302. // 初始化树的宽度
  303. this.leftSplitWidth = Math.ceil(widthVal / this.$refs.elMain.$el.clientWidth * 100);
  304. this.rightSplitWidth = 100 - (this.leftSplitWidth)
  305. },
  306. /**Split 结束 */
  307. //--left tree start-------
  308. findLeftTreeData: function () {
  309. // 获取数据
  310. this.$api.dept.findTree().then(res => {
  311. this.ztreeNodes = res.data;
  312. });
  313. },
  314. onZTreeCreated: function (ztreeObj) {
  315. this.ztreeObj = ztreeObj;
  316. // onCreated 中操作ztreeObj对象展开第一个节点
  317. ztreeObj.expandNode(ztreeObj.getNodes()[0], true);
  318. this.currentTreeNode = ztreeObj.getNodes()[0];
  319. },
  320. onZTreeClick: function (evt, treeId, treeNode) {
  321. // 点击事件
  322. this.currentTreeNode = treeNode;
  323. this.pageRequest.columnFilters.deptid.value = this.currentTreeNode.id;
  324. this.findPage();
  325. },
  326. //--left tree end-------
  327. // 查询Start
  328. queryStaffInfo(val) {
  329. this.pageRequest.columnFilters.id.value = this.queryFrom.id;
  330. this.pageRequest.columnFilters.name.value = this.queryFrom.name;
  331. this.pageRequest.columnFilters.mobile.value = this.queryFrom.tel;
  332. this.pageRequest.pageNum = 1;
  333. this.findPage();
  334. },
  335. // 查询End
  336. // 右侧列表的方法Start
  337. findPage(data) {
  338. // 获取分页数据
  339. if (data && data.pageRequest) {
  340. this.pageRequest.pageNum = data.pageRequest.pageNum;
  341. this.pageRequest.pageSize = data.pageRequest.pageSize;
  342. }
  343. this.$api.user.userQueryPage(this.pageRequest).then((res) => {
  344. if(res.code==200){
  345. //角色权限过滤转换
  346. res.data.content.forEach(item => {
  347. item.roleId=Number(item.roleId)
  348. })
  349. this.pageResult = res.data;
  350. }
  351. else{
  352. this.$message.error(res.msg)
  353. }
  354. }).then(data != null ? data.callback : '')
  355. },
  356. handleTableEdit(params) {
  357. this.dataForm = Object.assign({}, params.row)
  358. this.dataForm.isDial=this.dataForm.isDial==null?'0':'1';
  359. this.dataForm.showLevel=this.dataForm.showLevel=='null' || this.dataForm.showLevel==null?'subordinate':this.dataForm.showLevel
  360. this.dialogVisible = true
  361. },
  362. // 右侧列表的方法End
  363. // 新增或修改的弹出框Start
  364. getDictItems(typeName) {
  365. //--数据字典--
  366. this.$api.dict.findByLableName(typeName).then((response) => {
  367. this[typeName + "options"] = response.data; // 把获取到的数据赋给this.data
  368. }).catch((error) => {
  369. this[typeName + "options"] = [];
  370. })
  371. },
  372. handleDialogBefore(done) {
  373. // 退出对话框之前确认提示
  374. var that = this;
  375. this.$confirm('确认关闭?')
  376. .then(_ => {
  377. done();
  378. })
  379. .catch(_ => { });
  380. },
  381. closeDialog() {
  382. // 清空数据
  383. this.$refs['dataForm'].resetFields()
  384. for (let key in this.dataForm) {
  385. this.dataForm[key] = "";
  386. }
  387. this.dialogVisible = false
  388. },
  389. // 提交
  390. submitForm() {
  391. this.$confirm('确认提交吗?', '提示', {}).then(() => {
  392. this.$api.user.saveUserRole({
  393. roleId: this.dataForm.roleId,
  394. userId: this.dataForm.id,
  395. showLevel: this.dataForm.showLevel,
  396. isDial: this.dataForm.isDial,
  397. dialUserName:this.dataForm.dialUserName,
  398. dialPassWord:this.dataForm.dialPassWord,
  399. }).then((res) => {
  400. if (res.code == 200) {
  401. this.$message({
  402. message: '操作成功',
  403. type: 'success'
  404. })
  405. this.findPage(null);
  406. this.dialogVisible = false
  407. } else {
  408. this.$message({
  409. message: '操作失败',
  410. type: 'error'
  411. })
  412. }
  413. })
  414. }).catch(() => {
  415. this.$message({
  416. type: 'info',
  417. message: '已取消提交'
  418. });
  419. });
  420. },
  421. // 新增或修改的弹出框End
  422. }
  423. }
  424. </script>
  425. <style scoped>
  426. .el-divider--horizontal {
  427. margin: 4px 0;
  428. }
  429. /* 顶部查询条件样式Start */
  430. .queryFrom .el-row {
  431. margin: 10px 0px;
  432. }
  433. .queryFrom .el-form-item {
  434. margin-bottom: 0px;
  435. }
  436. .queryFrom .queryButton .el-form-item__content {
  437. margin-left: 0px !important;
  438. }
  439. /* 顶部查询条件样式End */</style>