addRole.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <template>
  2. <el-card>
  3. <el-form
  4. :model="ruleForm"
  5. :rules="rules"
  6. ref="form"
  7. label-width="110px"
  8. label-position="left"
  9. >
  10. <el-form-item prop="roleName" label="职位名称">
  11. <el-input style="width: 280px" v-model="ruleForm.roleName"></el-input>
  12. </el-form-item>
  13. <el-form-item prop="deptId" label="部门">
  14. <el-select
  15. style="width: 280px"
  16. v-model="ruleForm.deptId"
  17. placeholder="请选择部门"
  18. >
  19. <el-option
  20. v-for="item in departmentSelect"
  21. :key="item"
  22. :label="item.value"
  23. :value="item.key"
  24. />
  25. </el-select>
  26. </el-form-item>
  27. </el-form>
  28. </el-card>
  29. <el-card class="mt30 p30">
  30. <h4 class="mb30">权限设置</h4>
  31. <el-tree
  32. ref="treeRef"
  33. :data="basePermissionData"
  34. show-checkbox
  35. default-expand-all
  36. node-key="code"
  37. highlight-current
  38. :props="defaultProps"
  39. :default-checked-keys="checkedNodes"
  40. style="display: flex; justify-content: space-between"
  41. />
  42. <div class="df aic jcfe mt50">
  43. <el-button type="primary" @click="addRole">{{
  44. roleId ? "修改员工" : "添加职位"
  45. }}</el-button>
  46. </div>
  47. </el-card>
  48. </template>
  49. <script setup>
  50. import api from "../../apis/fetch";
  51. import store from "../../store";
  52. import router from "../../router";
  53. import { ref, onMounted, reactive, computed } from "vue";
  54. import { ElNotification, ElMessageBox } from "element-plus";
  55. import { mapGetters } from "vuex";
  56. import { useRoute } from "vue-router";
  57. const route = useRoute();
  58. let loginAccountId = ref(0);
  59. let form = ref(null);
  60. let ruleForm = ref({
  61. roleName: "",
  62. deptId: "",
  63. });
  64. const rules = reactive({
  65. roleName: [
  66. {
  67. required: true,
  68. message: "请填角色名称",
  69. trigger: "blur",
  70. },
  71. ],
  72. deptId: [
  73. {
  74. required: true,
  75. message: "请选择部门",
  76. trigger: "blur",
  77. },
  78. ],
  79. });
  80. let roleId = ref("");
  81. let treeRef = ref(null);
  82. const defaultProps = {
  83. children: "children",
  84. label: "label",
  85. };
  86. let basePermissionData = computed(() => store.state.basePermissionData);
  87. let baseParentNodes = computed(() => store.state.baseParentNodes);
  88. let checkedNodes = ref([]);
  89. async function getRoleDetail(roleId) {
  90. let res = await api.getRoleDetail({
  91. loginAccountId: loginAccountId.value,
  92. roleId,
  93. });
  94. if (res.data.status == 0) {
  95. let { code, departmentId, roleName, permission, cargoLimit, proxyLimit } =
  96. res.data.result;
  97. ruleForm.value = {
  98. roleName,
  99. deptId: departmentId,
  100. };
  101. let c = cargoLimit.split(",");
  102. let cargoLimitArr = [];
  103. for (let i of c) {
  104. cargoLimitArr.push(`CARGO_${i}`);
  105. }
  106. let p = proxyLimit.split(",");
  107. let proxyLimitArr = [];
  108. for (let i of p) {
  109. proxyLimitArr.push(`PROXY_${i}`);
  110. }
  111. let arr = permission.split(",");
  112. baseParentNodes.value.forEach((item) => {
  113. for (let i of arr) {
  114. if (i == item) {
  115. let index = arr.indexOf(i);
  116. arr.splice(index, 1);
  117. }
  118. }
  119. });
  120. checkedNodes.value = [...arr, ...cargoLimitArr, ...proxyLimitArr];
  121. }
  122. }
  123. async function addRole() {
  124. let fullChecked = treeRef.value.getCheckedNodes();
  125. let halfCHecked = treeRef.value.getHalfCheckedNodes();
  126. let permissionCodes = [];
  127. for (let i of fullChecked) {
  128. permissionCodes.push(i.code);
  129. }
  130. for (let i of halfCHecked) {
  131. permissionCodes.push(i.code);
  132. }
  133. let postData = {
  134. loginAccountId: loginAccountId.value,
  135. ...ruleForm.value,
  136. permissionCodes: permissionCodes.join(","),
  137. };
  138. if (roleId.value) {
  139. postData.roleId = roleId.value;
  140. }
  141. let res = await api[roleId.value ? "updateRole" : "addRole"](postData);
  142. if (res.data.status == 0) {
  143. ElNotification({
  144. title: "成功",
  145. duration: 1500,
  146. message: res.data.msg,
  147. type: "success",
  148. });
  149. store.dispatch("GetBasePermissionData", localStorage.loginAccountId);
  150. store.dispatch("GetUserPermission", localStorage.loginAccountId);
  151. router.replace("/authManage/roleList");
  152. } else {
  153. console.log(res);
  154. ElNotification({
  155. title: "失败",
  156. duration: 1500,
  157. message: res.data.msg,
  158. type: "error",
  159. });
  160. }
  161. }
  162. let departmentSelect = ref([]);
  163. async function getDepartmentSelect() {
  164. let res = await api.getDepartmentSelect({
  165. loginAccountId: loginAccountId.value,
  166. });
  167. departmentSelect.value = res.data.result;
  168. }
  169. onMounted(() => {
  170. loginAccountId.value = localStorage.loginAccountId;
  171. getDepartmentSelect();
  172. store.dispatch("GetBasePermissionData", localStorage.loginAccountId);
  173. let id = route.query.roleId;
  174. if (id) {
  175. getRoleDetail(id);
  176. roleId.value = id;
  177. store.commit("changefirstTitle", "修改员工");
  178. }
  179. });
  180. </script>
  181. <style scoped>
  182. .seach-btn {
  183. display: inline-block;
  184. width: 60px;
  185. height: 38px;
  186. background: #0094fe;
  187. border-radius: 2px;
  188. font-size: 14px;
  189. font-family: PingFangSC-Regular, PingFang SC;
  190. font-weight: 400;
  191. color: #ffffff;
  192. text-align: center;
  193. line-height: 38px;
  194. margin-left: 10px;
  195. cursor: pointer;
  196. }
  197. </style>