PersonInfoModal.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <template>
  2. <a-modal :visible="true" :maskClosable="false" centered :destroyOnClose="true" :title="title"
  3. :wrapClassName="wrapClassName" :width="width" @cancel="onClose" @ok="onSubmit">
  4. <div class="content">
  5. <div class="display-info">
  6. <div class="left-list">
  7. <div class="list-item">
  8. <div class="item-title">用户名称:</div>
  9. <div class="item-text">{{ baseForm.userName }}</div>
  10. </div>
  11. <div class="list-item">
  12. <div class="item-title">登录名称:</div>
  13. <div class="item-text">{{ baseForm.loginName }}</div>
  14. </div>
  15. <div class="list-item">
  16. <div class="item-title">手机号码:</div>
  17. <div class="item-text">{{ baseForm.mobile }}</div>
  18. </div>
  19. <div class="list-item">
  20. <div class="item-title">用户角色:</div>
  21. <div class="item-text">{{ baseForm.roles }}</div>
  22. </div>
  23. </div>
  24. <div class="right-head">
  25. <div class="img-box">
  26. <img :src="headerImg" alt="">
  27. </div>
  28. <div class="label">默认头像</div>
  29. </div>
  30. </div>
  31. <div class="edit-info">
  32. <div class="title">基本信息修改</div>
  33. <a-form ref="formRef" :model="form" :rules="rules" :label-col="labelCol" :wrapper-col="wrapperCol">
  34. <!-- 名称 -->
  35. <a-form-item label="用户名称" name="userName">
  36. <a-input v-model:value="form.userName" style="width: 100%" placeholder="请输入" />
  37. </a-form-item>
  38. <!-- 登录名称 -->
  39. <a-form-item label="登录名称" name="loginName">
  40. <a-input v-model:value="form.loginName" style="width: 100%" placeholder="请输入" disabled/>
  41. </a-form-item>
  42. <!-- 职责 -->
  43. <a-form-item label="手机号码" name="mobile">
  44. <a-input v-model:value="form.mobile" style="width: 100%" placeholder="请输入" />
  45. </a-form-item>
  46. <!-- 排序 -->
  47. <a-form-item label="用户密码" name="pwd">
  48. <a-input v-model:value="form.pwd" type="password" style="width: 100%" placeholder="请输入" />
  49. </a-form-item>
  50. </a-form>
  51. </div>
  52. </div>
  53. <template #footer>
  54. <div class="btns" style="display: flex;justify-content: center;">
  55. <a-button class="btn" @click="onClose"
  56. style="width: 64px;height: 34px;margin-right: 25px;color: #333333;">取消</a-button>
  57. <a-button class="btn" @click="onSubmit"
  58. style="width: 64px;height: 34px;background: #0671DD;color: #ffffff;">确定</a-button>
  59. </div>
  60. </template>
  61. </a-modal>
  62. </template>
  63. <script>
  64. import { defineComponent, reactive, ref, onMounted, watch, toRefs } from 'vue';
  65. import { message } from 'ant-design-vue';
  66. import moment from 'moment';
  67. import { v4 as uuidv4 } from 'uuid';
  68. import { savePosition } from '/@/api/sys/position';
  69. import headerImg from "/@/assets/images/header-icon.png";
  70. // 正则表达式验证
  71. import { ChineseRegexp, EmailRegexp, phoneRegexp } from '/@/utils/rules';
  72. import { getUserInfoByLoginCode, SaveOrUpdateUserInfo } from '/@/api/system/system';
  73. import { getUserIdInfo } from '/@/api/sys/user';
  74. import md5 from 'js-md5';
  75. const props = {
  76. formData: {
  77. type: Object,
  78. default: {}
  79. }
  80. }
  81. export default defineComponent({
  82. name: 'modal',
  83. components: {},
  84. props,
  85. setup(props, { emit }) {
  86. const data = reactive({
  87. width: '380px',
  88. wrapClassName: 'modal-wrap',
  89. })
  90. const form = reactive({
  91. userid: "",
  92. userName: "",
  93. loginName: "",
  94. mobile: "",
  95. userid: '',
  96. pwd: ""
  97. });
  98. const baseForm = reactive({
  99. userName: "",
  100. loginName: "",
  101. mobile: "",
  102. roles: ""
  103. })
  104. const checkMobile = (rule, value, callback) => {
  105. if (!value) {
  106. return Promise.reject("请输入手机号")
  107. } else {
  108. //如果字符串 string 中含有与 RegExpObject 匹配的文本,则返回 true,否则返回 false。
  109. if (!phoneRegexp.test(value)) {
  110. return Promise.reject("手机号格式不正确")
  111. } else {
  112. return Promise.resolve()
  113. }
  114. }
  115. };
  116. const rules = {
  117. userName: [{
  118. required: true,
  119. message: '请输入姓名',
  120. trigger: 'blur'
  121. }],
  122. loginName: [{
  123. required: true,
  124. message: '请输入登录名',
  125. trigger: 'blur'
  126. }],
  127. pwd: [
  128. // { required: false, message: '未填时使用默认密码' },
  129. { required: false, pattern: /^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)(?=.*?[~!#@$%^*&()_+{}\[\]|\\;:'",<.>\/?])[a-zA-Z\d~!#@$%^*&()_+{}\[\]|\\;:'",<.>\/?]{8,30}$/, message: '密码中必须包含大小写字母、数字、特殊字符,至少8个字符,最多30个字符' }
  130. ],
  131. mobile: [
  132. { validator: checkMobile, trigger: "change" },
  133. ],
  134. };
  135. const title = ref('个人信息')
  136. const formRef = ref()
  137. onMounted(() => {
  138. console.log(props.formData);
  139. //取LOGIN_NAM去查询用户的基础信息
  140. if (props.formData.LOGIN_NAME) {
  141. getUserBaseInfo(props.formData.LOGIN_NAME);
  142. baseForm.roles = props.formData.nameroles;
  143. }
  144. })
  145. const getUserBaseInfo = (loginName) => {
  146. getUserInfoByLoginCode(loginName).then(res => {
  147. if (res.user?.userid) {
  148. getUserIdInfo(res.user.userid).then(roleRes => {
  149. //组合信息传给修改弹窗
  150. baseForm.userName = res.user.userName;
  151. baseForm.loginName = res.user.loginName;
  152. baseForm.mobile = res.user.mobile;
  153. form.userid = res.user.userid;
  154. form.sex = res.user.sex;
  155. form.ssjg = res.department[0]?.departid || '';
  156. form.sszw = res.zw[0]?.departid || '';
  157. form.ssgw = res.gw[0]?.id || '';
  158. form.userjs = roleRes.join(';');
  159. form.userName = res.user.userName;
  160. form.loginName = res.user.loginName;
  161. form.mobile = res.user.mobile;
  162. form.pwd = "";
  163. })
  164. } else {
  165. message.error('用户信息查询失败')
  166. }
  167. })
  168. }
  169. // 关闭请求弹窗
  170. const onClose = () => {
  171. emit('closeModal')
  172. resetForm()
  173. };
  174. const onSubmit = () => {
  175. formRef.value.validate().then((e) => {
  176. // if (e.pwd == "KJSJ@888!") {
  177. // e.pwd = "";
  178. // } else {
  179. // e.pwd = md5(e.pwd);
  180. // }
  181. e.pwd = e.pwd ? md5(e.pwd) : "";
  182. e.userid = form.userid;
  183. e.sex = form.sex;
  184. e.ssjg = form.ssjg;
  185. e.sszw = form.sszw;
  186. e.ssgw = form.ssgw;
  187. e.userjs = form.userjs;
  188. console.log("此处调用修改:", e)
  189. //此处调用修改
  190. SaveOrUpdateUserInfo(e).then(res => {
  191. if (res) {
  192. message.success('修改用户信息成功')
  193. } else {
  194. message.success('修改用户信息失败')
  195. }
  196. onClose()
  197. })
  198. }).catch((error) => {
  199. console.log('error', error);
  200. });
  201. };
  202. const resetForm = () => {
  203. formRef.value.resetFields();
  204. };
  205. return {
  206. headerImg,
  207. form,
  208. baseForm,
  209. rules,
  210. title,
  211. formRef,
  212. labelCol: { span: 6 },
  213. wrapperCol: { span: 16 },
  214. ...toRefs(data),
  215. //func
  216. onClose,
  217. onSubmit
  218. };
  219. },
  220. });
  221. </script>
  222. <style lang="less" scoped>
  223. .modal-wrap {
  224. .content {
  225. padding: 0px 20px 0px 20px;
  226. margin-top: 10px;
  227. .display-info {
  228. padding-bottom: 10px;
  229. display: flex;
  230. justify-content: space-between;
  231. align-items: center;
  232. border-bottom: 1px solid #DEDEDE;
  233. .left-list {
  234. .list-item {
  235. margin: 5px 0;
  236. display: flex;
  237. }
  238. }
  239. .right-head {
  240. margin-right: 33px;
  241. display: flex;
  242. flex-direction: column;
  243. justify-content: center;
  244. .img-box {
  245. width: 64px;
  246. height: 64px;
  247. img {
  248. width: 100%;
  249. height: 100%;
  250. }
  251. }
  252. .label {
  253. margin-top: 20px;
  254. width: 64px;
  255. text-align: center;
  256. }
  257. }
  258. }
  259. .edit-info {
  260. margin-top: 10px;
  261. .title {
  262. font-family: Source Han Sans CN;
  263. font-size: 14px;
  264. font-weight: 500;
  265. font-feature-settings: "kern" on;
  266. color: #333333;
  267. margin-bottom: 10px;
  268. }
  269. }
  270. }
  271. ::v-deep .ant-modal-footer {
  272. .btn {
  273. width: 64px;
  274. height: 34px;
  275. background-color: red;
  276. }
  277. }
  278. }
  279. </style>