UserManagementDialog.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <template>
  2. <el-dialog
  3. ref="dialog"
  4. :title="(isEdit ? '编辑' : '新增') + '用户'"
  5. width="450px"
  6. :visible.sync="visible"
  7. @close="closeDialog"
  8. >
  9. <el-form
  10. :model="form"
  11. ref="form"
  12. :rules="rules"
  13. label-position="right"
  14. label-width="120px"
  15. >
  16. <el-row>
  17. <el-form-item v-if="$store.state.user.orgId === null" label="机构">
  18. <OrgSelect v-model="form.orgId"></OrgSelect>
  19. </el-form-item>
  20. </el-row>
  21. <el-row>
  22. <el-form-item label="登录名" prop="loginName">
  23. <el-input
  24. class="pull_length"
  25. v-model="form.loginName"
  26. placeholder="登录名"
  27. />
  28. </el-form-item>
  29. </el-row>
  30. <el-row>
  31. <el-form-item label="姓名" prop="name">
  32. <el-input
  33. class="pull_length"
  34. v-model="form.name"
  35. placeholder="姓名"
  36. />
  37. </el-form-item>
  38. </el-row>
  39. <el-row>
  40. <el-form-item label="密码" prop="password">
  41. <el-input
  42. class="pull_length"
  43. v-model="form.password"
  44. type="password"
  45. autocomplete="new-password"
  46. placeholder="密码"
  47. />
  48. </el-form-item>
  49. </el-row>
  50. <el-row>
  51. <el-form-item label="再次输入密码" prop="passwordConfirm">
  52. <el-input
  53. class="pull_length"
  54. v-model="form.passwordConfirm"
  55. type="password"
  56. autocomplete="new-password"
  57. placeholder="再次输入密码"
  58. />
  59. </el-form-item>
  60. </el-row>
  61. <el-row>
  62. <el-form-item label="角色" prop="roleCode">
  63. <RoleSelect v-model="form.roleCode" :multiple="true" />
  64. </el-form-item>
  65. </el-row>
  66. <el-row>
  67. <el-form-item label="手机号" prop="mobileNumber">
  68. <el-input
  69. class="pull_length"
  70. v-model="form.mobileNumber"
  71. placeholder="联系方式"
  72. />
  73. </el-form-item>
  74. </el-row>
  75. <el-row>
  76. <el-form-item label="状态" prop="enable">
  77. <el-radio-group class="pull_right_sm" v-model="form.enable">
  78. <el-radio :label="1">启用</el-radio>
  79. <el-radio :label="0">禁用</el-radio>
  80. </el-radio-group>
  81. </el-form-item>
  82. </el-row>
  83. <el-row class="d-flex justify-content-center">
  84. <el-button type="primary" @click="submitForm" :loading="loading"
  85. >保 存</el-button
  86. >
  87. <el-button @click="closeDialog">取 消</el-button>
  88. </el-row>
  89. </el-form>
  90. </el-dialog>
  91. </template>
  92. <script>
  93. import RoleSelect from "@/components/RoleSelect";
  94. import { saveUser } from "@/api/system-user";
  95. import OrgSelect from "@/components/OrgSelect";
  96. export default {
  97. name: "UserManagementDialog",
  98. components: { RoleSelect, OrgSelect },
  99. props: {
  100. user: Object,
  101. },
  102. computed: {
  103. isEdit() {
  104. return this.user.id;
  105. },
  106. rules() {
  107. const that = this;
  108. return {
  109. loginName: [
  110. {
  111. required: true,
  112. message: "登录名必填",
  113. whitespace: true,
  114. },
  115. { min: 1, max: 20, message: "最长为20个字符" },
  116. ],
  117. name: [
  118. { required: true, message: "姓名必填", whitespace: true },
  119. { min: 1, max: 20, message: "最长为20个字符" },
  120. ],
  121. password: [
  122. { required: !this.isEdit, message: "密码必填" },
  123. {
  124. required: !this.isEdit,
  125. min: 1,
  126. max: 16,
  127. message: "最长为16个字符",
  128. },
  129. {
  130. required: !this.isEdit,
  131. type: "string",
  132. pattern: /^[a-z0-9_]+$/i,
  133. message: "仅支持大小写英文字母、数字和下划线",
  134. },
  135. ],
  136. passwordConfirm: [
  137. { required: !this.isEdit, message: "密码必填" },
  138. {
  139. required: !this.isEdit,
  140. type: "string",
  141. pattern: /^[a-z0-9_]+$/i,
  142. message: "仅支持大小写英文字母、数字和下划线",
  143. },
  144. {
  145. type: "string",
  146. trigger: "blur",
  147. validator: function (rule, value, callback) {
  148. console.log(that.isEdit, value, that.form.password);
  149. if (
  150. that.isEdit &&
  151. (that.form.password === undefined ||
  152. that.form.password.trim().length === 0) &&
  153. (value === undefined || value.trim().length === 0)
  154. ) {
  155. console.log("object");
  156. callback();
  157. return;
  158. }
  159. console.log("pos");
  160. if (value !== that.form.password) {
  161. callback(new Error("与密码不一致"));
  162. } else {
  163. callback();
  164. }
  165. },
  166. message: "与密码不一致",
  167. },
  168. ],
  169. roleCode: [{ required: true, message: "角色必填" }],
  170. mobileNumber: [
  171. { required: false, pattern: /^\d*$/i, message: "手机号必须是数字" },
  172. ],
  173. };
  174. },
  175. },
  176. data() {
  177. return {
  178. visible: false,
  179. form: {},
  180. loading: false,
  181. };
  182. },
  183. watch: {
  184. user(val) {
  185. this.resetForm(val);
  186. },
  187. },
  188. methods: {
  189. resetForm(val) {
  190. let tmp = { ...val };
  191. // console.log({ user: this.user, tmp, val });
  192. if (!tmp.id) {
  193. tmp = {
  194. orgId: this.$store.state.user.orgId,
  195. name: "",
  196. loginName: "",
  197. password: "",
  198. mobileNumber: "",
  199. roleCode: [],
  200. enable: 1,
  201. };
  202. }
  203. this.form = tmp;
  204. },
  205. openDialog() {
  206. this.resetForm(this.user);
  207. this.visible = true;
  208. },
  209. closeDialog() {
  210. this.visible = false;
  211. },
  212. async submitForm() {
  213. try {
  214. const valid = await this.$refs.form.validate();
  215. if (!valid) return;
  216. } catch (error) {
  217. console.log("校验失败", error);
  218. return;
  219. }
  220. let data = this.form;
  221. if (this.isEdit) {
  222. data = { ...data, id: this.user.id };
  223. }
  224. try {
  225. this.loading = true;
  226. await saveUser(data);
  227. this.$emit("reload");
  228. this.$notify({ title: "保存成功", type: "success" });
  229. this.closeDialog();
  230. } finally {
  231. this.loading = false;
  232. }
  233. },
  234. },
  235. };
  236. </script>
  237. <style></style>