CreateDrawer.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <template>
  2. <el-drawer v-model="isDrawer" :size="width" :title="title" @close="handleReset">
  3. <el-form
  4. :model="formParams"
  5. :rules="rules"
  6. ref="formRef"
  7. label-placement="left"
  8. :label-width="80"
  9. >
  10. <el-form-item label="登录账号" prop="username">
  11. <el-input
  12. placeholder="请输入登录账号"
  13. v-model="formParams.username"
  14. :disabled="formParams.userId ? true : false"
  15. />
  16. </el-form-item>
  17. <el-form-item label="所属部门" prop="deptId">
  18. <el-tree-select
  19. :data="deptList"
  20. clearable
  21. check-strictly
  22. v-model="formParams.deptId"
  23. placeholder="请选择部门"
  24. />
  25. </el-form-item>
  26. <el-form-item label="密码" :prop="!formParams.userId ? 'password' : ''">
  27. <el-input
  28. type="password"
  29. show-password-on="mousedown"
  30. placeholder="请输入密码"
  31. v-model="formParams.password"
  32. />
  33. </el-form-item>
  34. <el-form-item label="确认密码" :prop="!formParams.userId ? 'passwordRe' : ''">
  35. <el-input
  36. type="password"
  37. show-password-on="mousedown"
  38. placeholder="请输入密码"
  39. v-model="formParams.passwordRe"
  40. />
  41. </el-form-item>
  42. <el-form-item label="角色" prop="roleIds">
  43. <el-select clearable v-model="formParams.roleIds" multiple>
  44. <el-option
  45. v-for="(item, index) in getRoleList"
  46. :key="index"
  47. :label="item.label"
  48. :value="item.value"
  49. />
  50. </el-select>
  51. </el-form-item>
  52. <el-form-item label="用户名" prop="nickname">
  53. <el-input placeholder="请输入用户名" v-model="formParams.nickname" />
  54. </el-form-item>
  55. <el-form-item label="手机" prop="mobile">
  56. <el-input placeholder="请输入手机" v-model="formParams.mobile" />
  57. </el-form-item>
  58. <el-form-item label="邮箱" prop="email">
  59. <el-input placeholder="请输入邮箱" v-model="formParams.email" />
  60. </el-form-item>
  61. <el-form-item label="性别" prop="sex">
  62. <el-radio-group v-model="formParams.sex" name="sexGroup">
  63. <el-radio v-for="item in sexList" :key="item.dictValue" :label="item.dictLabel">
  64. {{ item.dictLabel }}
  65. </el-radio>
  66. </el-radio-group>
  67. </el-form-item>
  68. <el-form-item label="所在岗位" prop="postId">
  69. <el-select clearable multiple v-model="formParams.postId" placeholder="请选择所在岗位">
  70. <el-option
  71. v-for="(item, index) in postDataList"
  72. :key="index"
  73. :label="item.postName"
  74. :value="item.postId"
  75. />
  76. </el-select>
  77. </el-form-item>
  78. <el-form-item label="个人介绍" prop="remark">
  79. <el-input type="textarea" placeholder="请输入个人介绍" v-model="formParams.remark" />
  80. </el-form-item>
  81. <el-form-item label="是否启用" prop="isEnable">
  82. <el-switch v-model="formParams.isEnable" />
  83. </el-form-item>
  84. </el-form>
  85. <template #footer>
  86. <el-space>
  87. <el-button @click="handleReset">重置</el-button>
  88. <el-button type="primary" :loading="subLoading" @click="formSubmit">提交</el-button>
  89. </el-space>
  90. </template>
  91. </el-drawer>
  92. </template>
  93. <script lang="ts" setup>
  94. import { ref, onMounted, computed } from 'vue';
  95. import { FormRules, ElMessage } from 'element-plus';
  96. import type { formParamsType } from './types';
  97. import { useDictionary } from '@/hooks/web/useDictionary';
  98. import { addUsur, editUsur, userInfo } from '@/api/system/user';
  99. import { postList } from '@/api/common/index';
  100. import { deptTreeList } from '@/api/auth/dept';
  101. import { cloneDeep } from 'lodash-es';
  102. import { replaceParams } from '@/utils/helper/treeHelper';
  103. const rules: FormRules = {
  104. username: {
  105. required: true,
  106. message: '登录账号不能为空',
  107. trigger: 'blur',
  108. },
  109. deptId: {
  110. required: true,
  111. message: '部门不能为空',
  112. trigger: 'change',
  113. type: 'number',
  114. },
  115. roleIds: {
  116. required: true,
  117. message: '角色不能为空',
  118. trigger: 'change',
  119. type: 'array',
  120. },
  121. password: {
  122. required: true,
  123. message: '密码不能为空',
  124. trigger: 'blur',
  125. },
  126. passwordRe: {
  127. required: true,
  128. message: '密码不能为空',
  129. trigger: 'blur',
  130. },
  131. };
  132. interface PostOption {
  133. postName: string;
  134. postId: number;
  135. }
  136. const emit = defineEmits(['change']);
  137. const { getDictTypeList } = useDictionary();
  138. const props = defineProps({
  139. title: {
  140. type: String,
  141. default: '添加会员',
  142. },
  143. width: {
  144. type: Number,
  145. default: 450,
  146. },
  147. roleList: {
  148. type: Array,
  149. },
  150. });
  151. const sexList = ref<any[]>();
  152. const deptList = ref<any[]>();
  153. const postDataList = ref<PostOption[]>([]);
  154. const defaultValueRef = () => ({
  155. userId: null,
  156. roleIds: [],
  157. isEnable: true,
  158. deptId: null,
  159. email: '',
  160. mobile: '',
  161. nickname: '',
  162. password: '',
  163. passwordRe: '',
  164. remark: '',
  165. sex: '',
  166. username: '',
  167. postId: [],
  168. });
  169. const getRoleList = computed(() => {
  170. return props.roleList as SelectOption[];
  171. });
  172. const message = ElMessage;
  173. const formRef: any = ref(null);
  174. const isDrawer = ref(false);
  175. const subLoading = ref(false);
  176. const formParams = ref<formParamsType>(defaultValueRef());
  177. async function openDrawer(userId?) {
  178. const deptResList = await deptTreeList();
  179. deptList.value = replaceParams(deptResList, 'deptName', 'deptId');
  180. const postListRes = await postList();
  181. postDataList.value = postListRes;
  182. if (userId) {
  183. formParams.value.userId = userId;
  184. getInfo();
  185. return;
  186. }
  187. isDrawer.value = true;
  188. }
  189. function closeDrawer() {
  190. isDrawer.value = false;
  191. }
  192. function formSubmit() {
  193. formRef.value.validate((valid) => {
  194. if (!valid) {
  195. return message.error('请填写完整信息');
  196. }
  197. // 克隆
  198. const params = cloneDeep(formParams.value);
  199. // 处理岗位
  200. if (params.postId && params.postId.length) {
  201. params.postId = params.postId.join(',');
  202. } else {
  203. params.postId = '';
  204. }
  205. // 处理部门
  206. if (params.deptId) {
  207. params.deptId = params.deptId + '';
  208. }
  209. if (params.password != params.passwordRe) {
  210. return message.error('两次密码不一致');
  211. }
  212. const msg = params.userId ? '编辑成功' : '添加成功';
  213. if (params.userId) {
  214. editUsur(params).then((_) => {
  215. message.success(msg);
  216. emit('change');
  217. handleReset();
  218. closeDrawer();
  219. });
  220. } else {
  221. addUsur(params).then((_) => {
  222. message.success(msg);
  223. emit('change');
  224. handleReset();
  225. closeDrawer();
  226. });
  227. }
  228. });
  229. }
  230. function handleReset() {
  231. formRef.value.resetFields();
  232. formParams.value = Object.assign(formParams.value, defaultValueRef());
  233. }
  234. function getInfo() {
  235. userInfo({ userId: formParams.value.userId }).then((res) => {
  236. const params = {
  237. userId: formParams.value.userId,
  238. deleteStatus: parseInt(res.deleteStatus),
  239. email: res.email,
  240. mobile: res.mobile,
  241. nickname: res.nickname,
  242. password: '',
  243. passwordRe: '',
  244. remark: res.remark,
  245. sex: res.sex,
  246. username: res.username,
  247. roleIds: res.roleIds,
  248. postId: res.postId ? res.postId.split(',').map(Number) : null,
  249. deptId: res.deptId || null,
  250. };
  251. formParams.value = Object.assign(formParams.value, params);
  252. isDrawer.value = true;
  253. });
  254. }
  255. onMounted(async () => {
  256. const list = await getDictTypeList({ dictType: 'sys_user_sex' });
  257. sexList.value = list;
  258. });
  259. defineExpose({
  260. openDrawer,
  261. closeDrawer,
  262. });
  263. </script>