role.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. <!-- -->
  2. <template>
  3. <div class="role_box">
  4. <el-card :style="'height:' + fullHeight + 'px'">
  5. <!-- 筛选 -->
  6. <el-row>
  7. <el-col>
  8. <!-- 组织搜索 -->
  9. <div class="search_box">
  10. <el-input
  11. size="mini"
  12. placeholder="请输入角色名称"
  13. v-model.trim="input"
  14. @change="searchData"
  15. clearable
  16. >
  17. </el-input>
  18. <div class="btn_box">
  19. <el-button type="primary" size="mini" @click="searchData"
  20. >搜索</el-button
  21. >
  22. <el-button type="primary" size="mini" @click="addrRole"
  23. >添加角色</el-button
  24. >
  25. </div>
  26. </div>
  27. </el-col>
  28. </el-row>
  29. <!-- 列表 -->
  30. <el-table :data="tableData" v-loading="loading" stripe style="width: 100%">
  31. <el-table-column prop="ind" label="序号" width="280"></el-table-column>
  32. <el-table-column prop="role_name" label="角色名称" width="380">
  33. </el-table-column>
  34. <el-table-column prop="role_message" label="角色描述" width="580">
  35. </el-table-column>
  36. <el-table-column label="操作">
  37. <template slot-scope="scope">
  38. <a class="reset" href="javascript:;" @click="actionFunc(scope.row)"
  39. >编辑</a
  40. >
  41. <i class="line"></i>
  42. <a class="delete" href="javascript:;" @click="deleteFunc(scope.row)"
  43. >删除</a
  44. >
  45. <i class="line"></i>
  46. <a class="addr" href="javascript:;" @click="limitsData(scope.row)"
  47. >分配权限</a
  48. >
  49. </template>
  50. </el-table-column>
  51. </el-table>
  52. <!-- 分页 -->
  53. <el-pagination
  54. v-if="tableData.length !== 0"
  55. @current-change="changeList"
  56. background
  57. layout="prev, pager, next, jumper"
  58. :current-page="page"
  59. :total="pagesum"
  60. >
  61. </el-pagination>
  62. </el-card>
  63. <!-- 添加用户 - 编辑用户 -->
  64. <el-dialog
  65. :title="tltData"
  66. :close-on-click-modal="false"
  67. :close-on-press-escape="false"
  68. :visible.sync="addrUserVisible"
  69. width="45%"
  70. >
  71. <el-form ref="form" :rules="rules" :model="form" label-width="90px">
  72. <el-form-item label="角色名称: " prop="name">
  73. <el-input
  74. style="width: 80%"
  75. size="mini"
  76. v-model.trim="form.name"
  77. ></el-input>
  78. </el-form-item>
  79. <el-form-item label="角色描述: " prop="describe">
  80. <el-input
  81. style="width: 80%"
  82. size="mini"
  83. type="textarea"
  84. resize="none"
  85. v-model.trim="form.describe"
  86. ></el-input>
  87. </el-form-item>
  88. <el-form-item>
  89. <el-button size="small" type="primary" @click="submitForm"
  90. >确定</el-button
  91. >
  92. <el-button size="small" @click="addrUserVisible = false"
  93. >取消</el-button
  94. >
  95. </el-form-item>
  96. </el-form>
  97. </el-dialog>
  98. <!-- 分配权限 -->
  99. <el-dialog
  100. title="分配权限"
  101. :visible.sync="setRightDialogVisible"
  102. width="50%"
  103. @close="setRightDialogClosed"
  104. :close-on-click-modal="false"
  105. :close-on-press-escape="false"
  106. >
  107. <el-tree
  108. :data="rightsList"
  109. :props="treeProps"
  110. ref="treeRef"
  111. show-checkbox
  112. node-key="pur_id"
  113. default-expand-all
  114. :default-checked-keys="defKeys"
  115. ></el-tree>
  116. <span slot="footer" class="dialog-footer">
  117. <el-button @click="setRightDialogVisible = false">取 消</el-button>
  118. <el-button type="primary" @click="allotRights">确 定</el-button>
  119. </span>
  120. </el-dialog>
  121. </div>
  122. </template>
  123. <script>
  124. export default {
  125. components: {},
  126. data() {
  127. //这里存放数据
  128. return {
  129. fullHeight: document.documentElement.clientHeight - 116, //
  130. input: "",
  131. tableData: [],
  132. loading: false, // 加载
  133. page: 1,
  134. pagesum: 0,
  135. // 添加用户 - 编辑用户
  136. tltData: "",
  137. addrUserVisible: false,
  138. form: {
  139. name: "",
  140. describe: "",
  141. },
  142. rules: {
  143. name: [
  144. { required: true, message: "请输入角色名称", trigger: "blur" },
  145. // { min: 3, max: 5, message: "长度在 1 到 15 个字符", trigger: "blur" },
  146. ],
  147. describe: [
  148. { required: true, message: "请输入角色描述", trigger: "blur" },
  149. // { min: 3, max: 5, message: "长度在 1 到 30 个字符", trigger: "blur" },
  150. ],
  151. },
  152. // 分配权限
  153. setRightDialogVisible: false,
  154. rightsList: [],
  155. // 默认选中节点ID值
  156. defKeys: [],
  157. describeData: {}, // 点击表格操作时获取到的当前数据
  158. // 树形控件的属性绑定对象
  159. treeProps: {
  160. label: "purview_name",
  161. children: "children",
  162. },
  163. };
  164. },
  165. //监听属性 类似于data概念
  166. computed: {},
  167. //监控data中的数据变化
  168. watch: {
  169. // 添加、编辑角色弹框
  170. addrUserVisible(val) {
  171. if (val == false) {
  172. this.form.name = "";
  173. this.form.describe = "";
  174. }
  175. },
  176. fullHeight(val) {
  177. //监控浏览器高度变化
  178. if (!this.timer) {
  179. this.fullHeight = val;
  180. this.timer = true;
  181. let that = this;
  182. setTimeout(function () {
  183. //防止过度调用监测事件,导致卡顿
  184. that.timer = false;
  185. }, 400);
  186. }
  187. },
  188. setRightDialogVisible(val) {
  189. if (val == false) {
  190. this.defKeys = []
  191. }
  192. },
  193. },
  194. //方法集合
  195. methods: {
  196. //动态获取浏览器高度
  197. get_boderHeight() {
  198. const that = this;
  199. window.onresize = () => {
  200. return (() => {
  201. window.fullHeight = document.documentElement.clientHeight;
  202. that.fullHeight = window.fullHeight;
  203. })();
  204. };
  205. },
  206. tabListData() {
  207. this.$axios({
  208. method: "POST",
  209. url: "/api/api_gateway?method=sysmenage.usermanager.role_list",
  210. data: this.qs.stringify({
  211. page: this.page,
  212. page_item: "10",
  213. role_name: this.input,
  214. }),
  215. })
  216. .then((res) => {
  217. if (res.data.data.total_item !== 0) {
  218. var data = res.data.data.page_list;
  219. this.pagesum = res.data.data.total_item;
  220. var list = [];
  221. data.forEach((item, index) => {
  222. item.ind = index + 1;
  223. list.push(item);
  224. });
  225. this.tableData = list;
  226. } else {
  227. this.tableData = [];
  228. this.pagesum = 0;
  229. }
  230. this.loading = false
  231. })
  232. .catch((err) => {
  233. this.loading = false
  234. });
  235. },
  236. // 搜索
  237. searchData() {
  238. this.tabListData();
  239. },
  240. // 下一页
  241. changeList(num) {
  242. this.page = num;
  243. this.tabListData();
  244. },
  245. // 添加角色
  246. addrRole() {
  247. this.tltData = "添加角色";
  248. this.addrUserVisible = true;
  249. },
  250. // 编辑角色
  251. actionFunc(data) {
  252. // console.log(data);
  253. this.describeData = data;
  254. this.tltData = "编辑角色";
  255. this.form.name = data.role_name; // 角色名称
  256. this.form.describe = data.role_message; // 角色描述
  257. this.addrUserVisible = true;
  258. },
  259. // 添加、编辑角色确定
  260. submitForm() {
  261. this.$refs["form"].validate((valid) => {
  262. if (valid) {
  263. if (this.tltData == "添加角色") {
  264. // 添加
  265. this.addrRoleAxios(); // 添加
  266. } else if (this.tltData == "编辑角色") {
  267. // 编辑
  268. this.editRoleAxios(); // 编辑
  269. }
  270. } else {
  271. // console.log("error submit!!");
  272. return false;
  273. }
  274. });
  275. },
  276. // 添加 - 确定
  277. addrRoleAxios() {
  278. this.$axios({
  279. method: "POST",
  280. url: "/api/api_gateway?method=sysmenage.usermanager.role_add",
  281. data: this.qs.stringify({
  282. role_name: this.form.name,
  283. role_message: this.form.describe,
  284. }),
  285. })
  286. .then((res) => {
  287. if (res.data.data == true) {
  288. this.$message({
  289. message: "成功!",
  290. type: "success",
  291. duration: 1500,
  292. });
  293. this.addrUserVisible = false;
  294. this.tabListData();
  295. } else {
  296. this.$message({
  297. message: "失败!",
  298. type: "error",
  299. duration: 1500,
  300. });
  301. }
  302. // console.log(res);
  303. this.addrUserVisible = false;
  304. })
  305. .catch((err) => {
  306. // console.log(err);
  307. });
  308. },
  309. // 编辑 - 确定
  310. editRoleAxios() {
  311. this.$axios({
  312. method: "POST",
  313. url: "/api/api_gateway?method=sysmenage.usermanager.role_modify",
  314. data: this.qs.stringify({
  315. role_id: this.describeData.id,
  316. role_name: this.form.name,
  317. role_message: this.form.describe,
  318. }),
  319. })
  320. .then((res) => {
  321. if (res.data.data == true) {
  322. this.$message({
  323. message: "成功!",
  324. type: "success",
  325. duration: 1500,
  326. });
  327. this.addrUserVisible = false;
  328. this.tabListData();
  329. } else {
  330. this.$message({
  331. message: "失败!",
  332. type: "error",
  333. duration: 1500,
  334. });
  335. }
  336. // console.log(res);
  337. this.addrUserVisible = false;
  338. })
  339. .catch((err) => {
  340. // console.log(err);
  341. });
  342. },
  343. // 分配权限
  344. limitsData(val) {
  345. this.describeData = val;
  346. this.$axios({
  347. method: "POST",
  348. url: "/api/api_gateway?method=sysmenage.usermanager.user_info",
  349. })
  350. .then((res) => {
  351. if (res.data.message == "") {
  352. var data = res.data.data.children;
  353. this.rightsList = []
  354. this.rightsList = data;
  355. this.limitsList(); //获取当前角色的权限
  356. } else {
  357. this.rightsList = []
  358. this.$message.error("获取权限列表失败!");
  359. }
  360. })
  361. .catch((err) => {
  362. // console.log(err)
  363. });
  364. },
  365. // 当前角色权限
  366. limitsList() {
  367. this.$axios({
  368. method: "POST",
  369. url: "/api/api_gateway?method=sysmenage.usermanager.role_info",
  370. data: this.qs.stringify({
  371. role_id: this.describeData.id, //角色ID
  372. }),
  373. })
  374. .then((res) => {
  375. if (res.data.data) {
  376. this.setRightDialogVisible = true;
  377. var list = this.tableData;
  378. for (var i = 0; i < list.length; i++) {
  379. if (list[i].id == this.describeData.id) {
  380. list[i]["children"] = res.data.data;
  381. this.defKeys = [];
  382. this.getLeafkeys(list[i], this.defKeys);
  383. }
  384. }
  385. this.tableData = list;
  386. } else {
  387. this.tableData = []
  388. }
  389. // this.tabListData = list;
  390. // this.tableData = list;
  391. })
  392. .catch((err) => {
  393. console.log(err);
  394. });
  395. },
  396. getLeafkeys(node, arr) {
  397. if (!node.children) {
  398. return arr.push(node.pur_id);
  399. }
  400. node.children.forEach((item) => this.getLeafkeys(item, arr));
  401. },
  402. setRightDialogClosed() {
  403. this.rightsList = [];
  404. },
  405. // 确定 - 分配权限
  406. allotRights() {
  407. var that = this
  408. // 获得当前选中的Id
  409. const keys = [
  410. ...this.$refs.treeRef.getCheckedKeys(),
  411. ...this.$refs.treeRef.getHalfCheckedKeys(),
  412. ];
  413. const idStr = keys.join(",");
  414. console.log(idStr);
  415. this.$axios({
  416. method: "POST",
  417. url: "/api/api_gateway?method=sysmenage.usermanager.role_perm",
  418. data: this.qs.stringify({
  419. pur_id: idStr, // 权限id
  420. role_id: this.describeData.id, // 角色id
  421. }),
  422. })
  423. .then((res) => {
  424. console.log(res);
  425. if (res.data.message == "") {
  426. this.$message.success("分配权限成功!");
  427. that.setRightDialogVisible = false;
  428. that.tabListData();
  429. }
  430. })
  431. .catch((err) => {
  432. console.log(err);
  433. });
  434. },
  435. // 删除
  436. deleteFunc(data) {
  437. this.$confirm("此操作将永久删除, 是否继续?", "提示", {
  438. confirmButtonText: "确定",
  439. cancelButtonText: "取消",
  440. type: "warning",
  441. })
  442. .then(() => {
  443. this.$axios({
  444. method: "POST",
  445. url: "/api/api_gateway?method=sysmenage.usermanager.role_delete",
  446. data: this.qs.stringify({
  447. role_id: data.id,
  448. }),
  449. })
  450. .then((res) => {
  451. if (res.data.message == "") {
  452. this.$message({
  453. type: "success",
  454. message: "删除成功!",
  455. duration: 1500,
  456. });
  457. }
  458. this.tabListData();
  459. })
  460. .catch((err) => {
  461. console.log(err);
  462. });
  463. })
  464. .catch(() => {
  465. this.$message({
  466. type: "info",
  467. message: "已取消删除",
  468. });
  469. });
  470. },
  471. },
  472. //生命周期 - 创建完成(可以访问当前this实例)
  473. created() {},
  474. //生命周期 - 挂载完成(可以访问DOM元素)
  475. mounted() {
  476. this.loading = true
  477. this.tabListData(); // 表格数据
  478. },
  479. beforeCreate() {}, //生命周期 - 创建之前
  480. beforeMount() {}, //生命周期 - 挂载之前
  481. beforeUpdate() {}, //生命周期 - 更新之前
  482. updated() {}, //生命周期 - 更新之后
  483. beforeDestroy() {}, //生命周期 - 销毁之前
  484. destroyed() {}, //生命周期 - 销毁完成
  485. activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
  486. };
  487. </script>
  488. <style lang='less' scoped>
  489. .role_box {
  490. .search_box {
  491. display: flex;
  492. /deep/.el-input {
  493. // width: 300px;
  494. width: 15%;
  495. }
  496. .btn_box {
  497. margin: 0 0 0 15px;
  498. }
  499. }
  500. a {
  501. text-decoration: none;
  502. }
  503. .reset {
  504. color: #1890ff;
  505. }
  506. .delete {
  507. color: #f56c6c;
  508. }
  509. .addr {
  510. color: #67c23a;
  511. }
  512. .line {
  513. display: inline-block;
  514. width: 1px;
  515. background: rgba(0, 0, 0, 0.09);
  516. margin: 0 11px;
  517. height: 14px;
  518. }
  519. }
  520. </style>