CreateDrawer.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <template>
  2. <el-drawer v-model="isDrawer" :size="width" :title="props.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="!isAddUser"
  15. />
  16. </el-form-item>
  17. <el-form-item label="所属部门" prop="deptId">
  18. <!-- <el-select v-model="formParams.deptId" placeholder="请选择组织" class="protocal-select">
  19. <el-option
  20. v-for="item in departmentList"
  21. :key="item.deptId"
  22. :label="item.deptName"
  23. :value="item.deptId"
  24. />
  25. </el-select> -->
  26. <el-tree-select
  27. v-model="formParams.deptId"
  28. :data="props.departmentList"
  29. :render-after-expand="false"
  30. :default-expand-all="true"
  31. check-strictly
  32. placeholder="请选择所属部门"
  33. class="protocal-select"
  34. />
  35. </el-form-item>
  36. <el-form-item v-if="isAddUser" label="密码" prop="password">
  37. <el-input
  38. type="password"
  39. show-password-on="mousedown"
  40. placeholder="请输入密码"
  41. v-model="formParams.password"
  42. />
  43. </el-form-item>
  44. <el-form-item
  45. v-if="isAddUser"
  46. label="确认密码"
  47. :prop="!formParams.username ? 'passwordRe' : ''"
  48. >
  49. <el-input
  50. type="password"
  51. show-password-on="mousedown"
  52. placeholder="请输入密码"
  53. v-model="formParams.passwordRe"
  54. />
  55. </el-form-item>
  56. <el-form-item label="角色" prop="roleIds">
  57. <el-select clearable v-model="formParams.roleIds" multiple>
  58. <el-option
  59. v-for="item in roleList!"
  60. :key="item.roleId"
  61. :label="item.roleName"
  62. :value="item.roleId"
  63. />
  64. </el-select>
  65. </el-form-item>
  66. <el-form-item label="姓名" prop="nickname">
  67. <el-input placeholder="请输入姓名" v-model="formParams.nickname" />
  68. </el-form-item>
  69. <el-form-item label="手机" prop="mobile">
  70. <el-input placeholder="请输入手机" v-model="formParams.mobile" />
  71. </el-form-item>
  72. <el-form-item label="工号" prop="staffNo">
  73. <el-input placeholder="请输入工号" v-model="formParams.staffNo" />
  74. </el-form-item>
  75. <el-form-item label="是否启用" prop="isEnable">
  76. <el-switch v-model="formParams.isEnable" />
  77. </el-form-item>
  78. </el-form>
  79. <template #footer>
  80. <el-space>
  81. <el-button @click="handleReset">重置</el-button>
  82. <el-button type="primary" :loading="subLoading" @click="formSubmit">提交</el-button>
  83. </el-space>
  84. </template>
  85. </el-drawer>
  86. </template>
  87. <script lang="ts" setup>
  88. import { ref, onMounted, computed } from 'vue';
  89. import { FormRules, ElMessage } from 'element-plus';
  90. import { useDictionary } from '@/hooks/web/useDictionary';
  91. import { userInfo } from '@/api/system/user';
  92. import { postList } from '@/api/common/index';
  93. import { cloneDeep } from 'lodash-es';
  94. import { UserType, addSingleUser, updateUser } from '@/api/system/user-operate';
  95. import useSelectContent from './hooks/use-user-para';
  96. const selectContent = useSelectContent();
  97. const { roleList } = selectContent;
  98. const rules: FormRules = {
  99. username: {
  100. required: true,
  101. message: '登录账号不能为空',
  102. trigger: 'blur',
  103. },
  104. deptId: {
  105. required: true,
  106. message: '部门不能为空',
  107. trigger: 'change',
  108. type: 'number',
  109. },
  110. roleIds: {
  111. required: true,
  112. message: '角色不能为空',
  113. trigger: 'change',
  114. type: 'array',
  115. },
  116. password: {
  117. required: true,
  118. message: '密码不能为空',
  119. trigger: 'blur',
  120. },
  121. passwordRe: {
  122. required: true,
  123. message: '密码不能为空',
  124. trigger: 'blur',
  125. },
  126. nickname: {
  127. required: true,
  128. message: '用户名不能为空',
  129. trigger: 'blur',
  130. },
  131. mobile: {
  132. required: true,
  133. message: '手机不能为空',
  134. trigger: 'blur',
  135. },
  136. staffNo: {
  137. required: true,
  138. message: '工号不能为空',
  139. trigger: 'blur',
  140. },
  141. };
  142. interface PostOption {
  143. postName: string;
  144. postId: number;
  145. }
  146. const emit = defineEmits(['change']);
  147. const { getDictTypeList } = useDictionary();
  148. const props = defineProps({
  149. title: {
  150. type: String,
  151. default: '添加用户',
  152. },
  153. width: {
  154. type: Number,
  155. default: 450,
  156. },
  157. departmentList:{
  158. type: Array,
  159. default: [],
  160. }
  161. });
  162. const sexList = ref<any[]>();
  163. // const deptList = ref<any[]>();
  164. const postDataList = ref<PostOption[]>([]);
  165. const defaultValueRef = () => ({
  166. password: '',
  167. passwordRe: '',
  168. deptId: null,
  169. username: '',
  170. staffNo: '',
  171. mobile: '',
  172. isEnable: true,
  173. nickname: '',
  174. roleIds: [],
  175. });
  176. const message = ElMessage;
  177. const formRef: any = ref(null);
  178. const isDrawer = ref(false);
  179. const subLoading = ref(false);
  180. const formParams = ref<UserType>(defaultValueRef());
  181. const isAddUser = computed(() => {
  182. return props.title === '添加用户';
  183. });
  184. async function openDrawer(username?) {
  185. const postListRes = await postList();
  186. postDataList.value = postListRes;
  187. if (username) {
  188. formParams.value.username = username;
  189. getInfo();
  190. return;
  191. }
  192. isDrawer.value = true;
  193. }
  194. function closeDrawer() {
  195. isDrawer.value = false;
  196. }
  197. function formSubmit() {
  198. formRef.value.validate((valid) => {
  199. if (!valid) {
  200. return message.error('请填写完整信息');
  201. }
  202. // 克隆
  203. const params = cloneDeep(formParams.value);
  204. // 处理部门
  205. console.log('params', params);
  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.username ? '编辑成功' : '添加成功';
  213. if (isAddUser.value) {
  214. const addData = {
  215. password: formParams.value.password,
  216. deptId: formParams.value.deptId,
  217. username: formParams.value.username,
  218. staffNo: formParams.value.staffNo,
  219. mobile: formParams.value.mobile,
  220. isEnable: formParams.value.isEnable,
  221. nickname: formParams.value.nickname,
  222. roleIds: formParams.value.roleIds,
  223. };
  224. addSingleUser(addData)
  225. .then((res) => {
  226. if (res.code !== 200) {
  227. return Promise.reject(res.msg);
  228. }
  229. emit('change');
  230. handleReset();
  231. closeDrawer();
  232. ElMessage.success('添加成功');
  233. })
  234. .catch((error) => {
  235. ElMessage.error(error);
  236. });
  237. } else {
  238. const updateData = {
  239. userId: params.userId,
  240. // password: formParams.value.password,
  241. deptId: formParams.value.deptId,
  242. username: formParams.value.username,
  243. staffNo: formParams.value.staffNo,
  244. mobile: formParams.value.mobile,
  245. isEnable: formParams.value.isEnable,
  246. nickname: formParams.value.nickname,
  247. roleIds: formParams.value.roleIds,
  248. deleteStatus: '1',
  249. };
  250. updateUser(updateData)
  251. .then((res) => {
  252. if (res.code !== 200) {
  253. return Promise.reject(res.msg);
  254. }
  255. emit('change');
  256. handleReset();
  257. closeDrawer();
  258. ElMessage.success('修改成功');
  259. })
  260. .catch((error) => {
  261. ElMessage.error(error);
  262. });
  263. }
  264. });
  265. }
  266. function handleReset() {
  267. formRef.value.resetFields();
  268. formParams.value = Object.assign(formParams.value, defaultValueRef());
  269. }
  270. function getInfo() {
  271. userInfo({ userId: formParams.value.username }).then((res) => {
  272. const params = {
  273. userId: formParams.value.username,
  274. deleteStatus: parseInt(res.deleteStatus),
  275. isEnable: res.isEnable,
  276. email: res.email,
  277. mobile: res.mobile,
  278. nickname: res.nickname,
  279. password: res.password,
  280. passwordRe: res.password,
  281. remark: res.remark,
  282. sex: res.sex,
  283. username: res.username,
  284. roleIds: res.roleIds,
  285. postId: res.postId ? res.postId.split(',').map(Number) : null,
  286. deptId: res.deptId || null,
  287. staffNo: res.staffNo,
  288. };
  289. formParams.value = Object.assign(formParams.value, params);
  290. isDrawer.value = true;
  291. });
  292. }
  293. onMounted(async () => {
  294. const list = await getDictTypeList({ dictType: 'sys_user_sex' });
  295. sexList.value = list;
  296. });
  297. defineExpose({
  298. openDrawer,
  299. closeDrawer,
  300. });
  301. </script>