BaseSetting.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <template>
  2. <div class="account-settings-info-view">
  3. <a-row :gutter="16">
  4. <a-col :md="24" :lg="16">
  5. <a-form layout="vertical" :form="form">
  6. <a-form-item
  7. label="昵称"
  8. >
  9. <a-input placeholder="给自己起个昵称吧" v-decorator="['nickName']"/>
  10. </a-form-item>
  11. <a-form-item
  12. label="生日"
  13. >
  14. <a-date-picker placeholder="请选择生日" @change="onChange" style="width: 100%" v-decorator="['birthday', {rules: [{required: true, message: '请选择生日!'}]}]" />
  15. </a-form-item>
  16. <a-form-item
  17. label="性别"
  18. >
  19. <a-radio-group v-decorator="['sex',{rules: [{ required: true, message: '请选择性别!' }]}]" >
  20. <a-radio v-for="(item,index) in sexData" :key="index" :value="item.code">{{ item.name }}</a-radio>
  21. </a-radio-group>
  22. </a-form-item>
  23. <a-form-item
  24. label="手机"
  25. >
  26. <a-input placeholder="请输入手机号" v-decorator="['phone', {rules: [{required: true, message: '请输入手机号!'}]}]"/>
  27. </a-form-item>
  28. <a-form-item
  29. label="电话"
  30. >
  31. <a-input placeholder="请输入电话" v-decorator="['tel', {rules: [{required: true, message: '请输入电话!'}]}]"/>
  32. </a-form-item>
  33. <a-form-item
  34. label="电子邮件"
  35. :required="false"
  36. >
  37. <a-input placeholder="请输入电子邮件地址" v-decorator="['email', {type: 'email',message: '请输入正确的邮箱号',rules: [{required: true, message: '请输入正确的邮箱号!'}]}]"/>
  38. </a-form-item>
  39. <a-form-item>
  40. <a-button type="primary" @click="submitUserInfo">更新基本信息</a-button>
  41. </a-form-item>
  42. </a-form>
  43. </a-col>
  44. <a-col :md="24" :lg="8" :style="{ minHeight: '180px' }">
  45. <div class="ant-upload-preview" @click="$refs.modal.edit(userInfo.id)" >
  46. <a-icon type="cloud-upload-o" class="upload-icon"/>
  47. <div class="mask">
  48. <a-icon type="plus" />
  49. </div>
  50. <img :src="option.img"/>
  51. </div>
  52. </a-col>
  53. </a-row>
  54. <avatar-modal ref="modal" @ok="setavatar"/>
  55. </div>
  56. </template>
  57. <script>
  58. import store from '@/store'
  59. import AvatarModal from './AvatarModal'
  60. import { mapGetters } from 'vuex'
  61. import moment from 'moment'
  62. import { sysUserUpdateInfo } from '@/api/modular/system/userManage'
  63. // mapActions
  64. export default {
  65. components: {
  66. AvatarModal
  67. },
  68. data () {
  69. return {
  70. // cropper
  71. preview: {},
  72. form: this.$form.createForm(this),
  73. sexData: [],
  74. option: {
  75. img: '/avatar2.jpg',
  76. info: true,
  77. size: 1,
  78. outputType: 'jpeg',
  79. canScale: false,
  80. autoCrop: true,
  81. // 只有自动截图开启 宽度高度才生效
  82. autoCropWidth: 180,
  83. autoCropHeight: 180,
  84. fixedBox: true,
  85. // 开启宽度和高度比例
  86. fixed: true,
  87. fixedNumber: [1, 1],
  88. // userInfo
  89. birthdayString: ''
  90. }
  91. }
  92. },
  93. computed: {
  94. ...mapGetters(['userInfo'])
  95. },
  96. mounted () {
  97. this.initUserInfo()
  98. },
  99. methods: {
  100. // ...mapActions(['GetInfo']),
  101. /**
  102. * 初始化用户信息
  103. */
  104. initUserInfo () {
  105. setTimeout(() => {
  106. this.form.setFieldsValue(
  107. {
  108. birthday: moment(this.userInfo.birthday, 'YYYY-MM-DD'),
  109. nickName: this.userInfo.nickName,
  110. sex: this.userInfo.sex.toString(),
  111. email: this.userInfo.email,
  112. phone: this.userInfo.phone,
  113. tel: this.userInfo.tel
  114. }
  115. )
  116. this.birthdayString = moment(this.userInfo.birthday).format('YYYY-MM-DD')
  117. this.option.img = process.env.VUE_APP_API_BASE_URL + '/sysFileInfo/preview?id=' + this.userInfo.avatar
  118. this.getSexData()
  119. }, 100)
  120. },
  121. /**
  122. * 日期需单独转换
  123. */
  124. onChange (date, dateString) {
  125. this.birthdayString = dateString
  126. },
  127. submitUserInfo () {
  128. const { form: { validateFields } } = this
  129. validateFields((err, values) => {
  130. if (!err) {
  131. values.birthday = this.birthdayString
  132. values.id = this.userInfo.id
  133. sysUserUpdateInfo(values).then((res) => {
  134. if (res.success) {
  135. this.$message.success('个人信息更新成功')
  136. store.dispatch('GetInfo').then(() => {})
  137. } else {
  138. this.$message.error(res.message)
  139. }
  140. })
  141. }
  142. })
  143. },
  144. getSexData () {
  145. this.sexData = this.$options.filters['dictData']('sex')
  146. },
  147. setavatar (url) {
  148. this.option.img = process.env.VUE_APP_API_BASE_URL + '/sysFileInfo/preview?id=' + url
  149. store.dispatch('GetInfo').then(() => {})
  150. }
  151. }
  152. }
  153. </script>
  154. <style lang="less" scoped>
  155. .avatar-upload-wrapper {
  156. height: 200px;
  157. width: 100%;
  158. }
  159. .ant-upload-preview {
  160. position: relative;
  161. margin: 0 auto;
  162. width: 100%;
  163. max-width: 180px;
  164. border-radius: 50%;
  165. box-shadow: 0 0 4px #ccc;
  166. .upload-icon {
  167. position: absolute;
  168. top: 0;
  169. right: 10px;
  170. font-size: 1.4rem;
  171. padding: 0.5rem;
  172. background: rgba(222, 221, 221, 0.7);
  173. border-radius: 50%;
  174. border: 1px solid rgba(0, 0, 0, 0.2);
  175. }
  176. .mask {
  177. opacity: 0;
  178. position: absolute;
  179. background: rgba(0,0,0,0.4);
  180. cursor: pointer;
  181. transition: opacity 0.4s;
  182. &:hover {
  183. opacity: 1;
  184. }
  185. i {
  186. font-size: 2rem;
  187. position: absolute;
  188. top: 50%;
  189. left: 50%;
  190. margin-left: -1rem;
  191. margin-top: -1rem;
  192. color: #d6d6d6;
  193. }
  194. }
  195. img, .mask {
  196. width: 100%;
  197. max-width: 180px;
  198. height: 100%;
  199. border-radius: 50%;
  200. overflow: hidden;
  201. }
  202. }
  203. </style>