addRole.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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 {
  96. code,
  97. departmentId,
  98. roleName,
  99. permission,
  100. cargoLimit,
  101. cargoOwnerLimit,
  102. } = res.data.result;
  103. ruleForm.value = {
  104. roleName,
  105. deptId: departmentId,
  106. };
  107. let c = cargoLimit.split(",");
  108. let cargoLimitArr = [];
  109. for (let i of c) {
  110. cargoLimitArr.push(`CARGO_${i}`);
  111. }
  112. let p = cargoOwnerLimit.split(",");
  113. let cargoOwnerArr = [];
  114. for (let i of p) {
  115. cargoOwnerArr.push(`CARGOOWNER_${i}`);
  116. }
  117. let arr = permission.split(",");
  118. baseParentNodes.value.forEach((item) => {
  119. for (let i of arr) {
  120. if (i == item) {
  121. let index = arr.indexOf(i);
  122. arr.splice(index, 1);
  123. }
  124. }
  125. });
  126. checkedNodes.value = [...arr, ...cargoLimitArr, ...cargoOwnerArr];
  127. }
  128. }
  129. async function addRole() {
  130. let fullChecked = treeRef.value.getCheckedNodes();
  131. let halfCHecked = treeRef.value.getHalfCheckedNodes();
  132. let permissionCodes = [];
  133. for (let i of fullChecked) {
  134. permissionCodes.push(i.code);
  135. }
  136. for (let i of halfCHecked) {
  137. permissionCodes.push(i.code);
  138. }
  139. let postData = {
  140. loginAccountId: loginAccountId.value,
  141. ...ruleForm.value,
  142. permissionCodes: permissionCodes.join(","),
  143. };
  144. if (roleId.value) {
  145. postData.roleId = roleId.value;
  146. }
  147. let res = await api[roleId.value ? "updateRole" : "addRole"](postData);
  148. if (res.data.status == 0) {
  149. ElNotification({
  150. title: "成功",
  151. duration: 1500,
  152. message: res.data.msg,
  153. type: "success",
  154. });
  155. store.dispatch("GetBasePermissionData", localStorage.loginAccountId);
  156. store.dispatch("GetUserPermission", localStorage.loginAccountId);
  157. router.replace("/authManage/roleList");
  158. } else {
  159. console.log(res);
  160. ElNotification({
  161. title: "失败",
  162. duration: 1500,
  163. message: res.data.msg,
  164. type: "error",
  165. });
  166. }
  167. }
  168. let departmentSelect = ref([]);
  169. async function getDepartmentSelect() {
  170. let res = await api.getDepartmentSelect({
  171. loginAccountId: loginAccountId.value,
  172. });
  173. departmentSelect.value = res.data.result;
  174. }
  175. onMounted(() => {
  176. loginAccountId.value = localStorage.loginAccountId;
  177. getDepartmentSelect();
  178. store.dispatch("GetBasePermissionData", localStorage.loginAccountId);
  179. let id = route.query.roleId;
  180. if (id) {
  181. getRoleDetail(id);
  182. roleId.value = id;
  183. store.commit("changefirstTitle", "修改员工");
  184. }
  185. });
  186. </script>
  187. <style scoped>
  188. .seach-btn {
  189. display: inline-block;
  190. width: 60px;
  191. height: 38px;
  192. background: #0094fe;
  193. border-radius: 2px;
  194. font-size: 14px;
  195. font-family: PingFangSC-Regular, PingFang SC;
  196. font-weight: 400;
  197. color: #ffffff;
  198. text-align: center;
  199. line-height: 38px;
  200. margin-left: 10px;
  201. cursor: pointer;
  202. }
  203. </style>