user-edit.vue 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <!-- 用户编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. width="820px"
  5. :visible="visible"
  6. :append-to-body="true"
  7. :close-on-click-modal="false"
  8. custom-class="ele-dialog-form"
  9. :title="isUpdate ? '修改用户' : '新建用户'"
  10. @update:visible="updateVisible"
  11. :maxable="true"
  12. >
  13. <el-form
  14. ref="form"
  15. :autoComplete="false"
  16. :model="form"
  17. :rules="rules"
  18. label-width="100px"
  19. >
  20. <el-row>
  21. <el-col :span="12">
  22. <el-form-item label="用户账号:" prop="loginName">
  23. <el-input
  24. clearable
  25. :maxlength="20"
  26. :disabled="isUpdate"
  27. v-model="form.loginName"
  28. placeholder="请输入用户账号"
  29. />
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="12">
  33. <el-form-item label="员工姓名:" prop="name">
  34. <el-input
  35. :maxlength="20"
  36. v-model="form.name"
  37. @click.native="setUsers"
  38. placeholder="选择人员"
  39. />
  40. </el-form-item>
  41. </el-col>
  42. <el-col :span="12">
  43. <el-form-item v-if="!isUpdate" label="登录密码:" prop="loginPwd">
  44. <el-input
  45. show-password
  46. :maxlength="20"
  47. v-model="form.loginPwd"
  48. placeholder="请输入登录密码"
  49. />
  50. </el-form-item>
  51. </el-col>
  52. <el-col :span="12">
  53. <el-form-item label="岗位:" prop="postName">
  54. <el-input
  55. placeholder=" "
  56. v-model="userInfo.postName"
  57. :disabled="true"
  58. />
  59. </el-form-item>
  60. </el-col>
  61. <el-col :span="12">
  62. <el-form-item label="启用状态:" prop="enable">
  63. <el-switch
  64. v-model="form.enable"
  65. active-color="#13ce66"
  66. inactive-color="#ff4949"
  67. :active-value="1"
  68. :inactive-value="0"
  69. >
  70. </el-switch>
  71. </el-form-item>
  72. </el-col>
  73. <el-col :span="24">
  74. <el-table
  75. :data="form.groupRolePOList"
  76. style="width: 100%"
  77. :border="true"
  78. >
  79. <el-table-column
  80. prop="groupName"
  81. label="组织机构"
  82. align="center"
  83. width="320"
  84. >
  85. <template slot-scope="scope">
  86. <el-cascader
  87. class="ele-block organizationList"
  88. :options="organizationList"
  89. placeholder=" "
  90. :props="defaultProps"
  91. ref="deptRef"
  92. :show-all-levels="true"
  93. :disabled="true"
  94. v-model="scope.row.groupId"
  95. ></el-cascader>
  96. </template>
  97. </el-table-column>
  98. <el-table-column prop="roleIds" label="角色" align="center">
  99. <template slot-scope="scope">
  100. <role-select v-model="scope.row.roleIds" />
  101. </template>
  102. </el-table-column>
  103. </el-table>
  104. <!-- <el-row>
  105. <el-col :span="12">
  106. <el-form-item label="部门:" prop="deptName">
  107. <el-input v-model="form.deptName" disabled />
  108. </el-form-item>
  109. </el-col>
  110. <el-col :span="12">
  111. <el-form-item label="角色:" prop="roleId">
  112. <role-select v-model="form.roleId" />
  113. </el-form-item>
  114. </el-col>
  115. </el-row> -->
  116. </el-col>
  117. </el-row>
  118. </el-form>
  119. <template v-slot:footer>
  120. <el-button @click="updateVisible(false)">取消</el-button>
  121. <el-button type="primary" :loading="loading" @click="save">
  122. 保存
  123. </el-button>
  124. </template>
  125. <add ref="addREf" @success="userBk"></add>
  126. </ele-modal>
  127. </template>
  128. <script>
  129. // import { emailReg, phoneReg } from 'ele-admin';
  130. import RoleSelect from './role-select.vue';
  131. import add from './add.vue';
  132. import { addUsers, putUsers, getById } from '@/api/system/user';
  133. import { getUserDetail } from '@/api/system/organization';
  134. export default {
  135. components: { RoleSelect, add },
  136. props: {
  137. // 弹窗是否打开
  138. visible: Boolean,
  139. // isUpdate: Boolean,
  140. // 修改回显的数据
  141. data: Object,
  142. organizationList: {
  143. type: Array,
  144. default: () => {
  145. return [];
  146. }
  147. }
  148. },
  149. data() {
  150. const defaultForm = {
  151. id: null,
  152. loginName: '',
  153. mainUserId: '',
  154. name: '',
  155. loginPwd: 123456,
  156. enable: 1,
  157. groupRolePOList: [],
  158. jobNumber: '',
  159. phone: ''
  160. };
  161. return {
  162. defaultForm,
  163. defaultProps: {
  164. multiple: true,
  165. checkStrictly: true,
  166. emitPath: false,
  167. children: 'children',
  168. value: 'id',
  169. label: 'name'
  170. },
  171. // 表单数据
  172. form: { ...defaultForm },
  173. // 表单验证规则
  174. rules: {
  175. loginName: [
  176. { required: true, message: '请输入用户账号', trigger: 'blur' }
  177. ],
  178. name: [{ required: true, message: '请选择员工', trigger: 'change' }],
  179. loginPwd: [
  180. {
  181. required: true,
  182. pattern: /^[\S]{5,18}$/,
  183. message: '密码必须为5-18位非空白字符',
  184. trigger: 'blur'
  185. }
  186. ]
  187. },
  188. // 提交状态
  189. loading: false,
  190. // 是否是修改
  191. isUpdate: false,
  192. userInfo: {
  193. postName: ''
  194. }
  195. };
  196. },
  197. computed: {
  198. // 是否开启响应式布局
  199. styleResponsive() {
  200. return this.$store.state.theme.styleResponsive;
  201. }
  202. },
  203. methods: {
  204. setUsers() {
  205. this.$refs.addREf.open('0');
  206. },
  207. async getUserDetail() {
  208. this.userInfo = await getUserDetail(this.form.mainUserId);
  209. },
  210. userBk(data) {
  211. if (data) {
  212. this.form.name = data.name;
  213. this.form.mainUserId = data.id;
  214. this.getUserDetail();
  215. this.form.jobNumber = data.jobNumber;
  216. this.form.phone = data.phone;
  217. this.form.groupRolePOList = [];
  218. if (!data.deptIds.includes(data.groupId)) {
  219. this.form.groupRolePOList.push({
  220. groupName: data.groupName,
  221. groupId: data.groupId,
  222. roleIds: []
  223. });
  224. }
  225. if (data.deptIds.length > 0) {
  226. const deptNames = data.deptName.split('/');
  227. data.deptIds.forEach((item, index) => {
  228. this.form.groupRolePOList.push({
  229. groupName: deptNames[index],
  230. groupId: item,
  231. roleIds: []
  232. });
  233. });
  234. }
  235. this.$forceUpdate();
  236. }
  237. },
  238. /* 保存编辑 */
  239. save() {
  240. this.$refs.form.validate((valid) => {
  241. let isRole = true;
  242. if (!valid) {
  243. return false;
  244. }
  245. this.form.groupRolePOList.forEach((item) => {
  246. if (item.roleIds.length == 0) {
  247. isRole = false;
  248. }
  249. });
  250. if (!isRole) {
  251. this.$message.warning('请选择角色!');
  252. return;
  253. }
  254. this.loading = true;
  255. if (!this.isUpdate) {
  256. delete this.form.id;
  257. }
  258. const data = {
  259. ...this.form
  260. // roleId: this.form.roleIds.map((d) => {
  261. // return { roleId: d };
  262. // })
  263. };
  264. const saveOrUpdate = this.isUpdate ? putUsers : addUsers;
  265. saveOrUpdate(data)
  266. .then((msg) => {
  267. this.loading = false;
  268. this.$message.success(msg);
  269. this.updateVisible(false);
  270. this.$emit('done');
  271. })
  272. .catch((e) => {
  273. this.loading = false;
  274. // this.$message.error(e.message);
  275. });
  276. });
  277. },
  278. /* 更新visible */
  279. updateVisible(value) {
  280. this.$emit('update:visible', value);
  281. },
  282. getByData(userRow, currentRow) {
  283. let id = this.data?.id || userRow?.id;
  284. getById(id).then((res) => {
  285. this.form = res.data;
  286. this.getUserDetail();
  287. this.form.groupRolePOList = [];
  288. res.data.groupRoleList.forEach((item) => {
  289. this.form.groupRolePOList.push({
  290. groupName: item.groupName,
  291. groupId: item.groupId,
  292. roleIds: item.roleVOList.map((ids) => ids.id)
  293. });
  294. });
  295. if (currentRow) {
  296. this.isUpdate = true;
  297. this.userBk(currentRow);
  298. }
  299. });
  300. }
  301. },
  302. watch: {
  303. visible(visible) {
  304. if (visible) {
  305. if (this.data) {
  306. this.getByData(this.data);
  307. // this.isUpdate = true;
  308. } else {
  309. // this.isUpdate = false;
  310. }
  311. } else {
  312. this.$refs.form.clearValidate();
  313. this.form = { ...this.defaultForm };
  314. }
  315. }
  316. // isUpdate(v){
  317. // console.log(v,66666);
  318. // this.isUpdate = v;
  319. // }
  320. }
  321. };
  322. </script>
  323. <style lang="scss" scoped>
  324. :deep(.el-input--medium .el-input__inner) {
  325. height: auto !important;
  326. }
  327. :deep(.el-table) {
  328. .el-form-item {
  329. margin-bottom: 0;
  330. }
  331. }
  332. :deep(.organizationList .el-input__inner) {
  333. border: 0;
  334. background: none;
  335. }
  336. :deep(.organizationList .el-input__suffix) {
  337. display: none;
  338. }
  339. :deep(.organizationList .el-tag) {
  340. background: none;
  341. }
  342. </style>