personMsg.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. <template>
  2. <div>
  3. <el-breadcrumb separator-class="el-icon-arrow-right">
  4. <el-breadcrumb-item>个人中心</el-breadcrumb-item>
  5. </el-breadcrumb>
  6. <el-card class="card">
  7. <el-form
  8. class="form"
  9. ref="userMsgRef"
  10. :model="userMsg"
  11. label-width="90px"
  12. :rules="editUserMsgRules"
  13. >
  14. <el-form-item label="用户头像:" prop="newPass">
  15. <el-upload
  16. class="avatar-uploader"
  17. action
  18. :auto-upload="false"
  19. :show-file-list="false"
  20. :on-change="changeUpload">
  21. <img v-if="userMsg.image" :src="userMsg.image" class="avatar" />
  22. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  23. </el-upload>
  24. <div class="hint">仅支持jpg、gif、jpeg、bmp格式,文件小于4M</div>
  25. </el-form-item>
  26. <el-form-item label="用户名:" prop="">
  27. <el-input type="text" disabled="disabled" v-model="userMsg.username"></el-input>
  28. </el-form-item>
  29. <el-form-item label="联系方式: " prop="mobile">
  30. <el-input type="mobile" v-model="userMsg.mobile" maxlength=11></el-input>
  31. </el-form-item>
  32. <el-form-item label="地址:">
  33. <div class="block">
  34. <el-cascader
  35. placeholder="搜索:河南"
  36. v-model="cityValue"
  37. :options="options"
  38. :props="props"
  39. @change="handleChange"
  40. filterable>
  41. </el-cascader>
  42. </div>
  43. </el-form-item>
  44. <el-form-item label="邮箱:" prop="email">
  45. <el-input type="email" v-model="userMsg.email" ></el-input>
  46. </el-form-item>
  47. <el-form-item>
  48. <el-button type="primary" @click="saveUserMsg">保存</el-button>
  49. <el-button @click="resetForm">取消</el-button>
  50. </el-form-item>
  51. </el-form>
  52. </el-card>
  53. <!-- vueCropper 剪裁图片实现-->
  54. <el-dialog title="图片剪裁" :visible.sync="cropperVisible" append-to-body>
  55. <div class="cropper-content">
  56. <div style="width:100%;height:500px">
  57. <vueCropper
  58. ref="cropper"
  59. :img="photo.img"
  60. autoCrop
  61. centerBox
  62. fixed
  63. :fixedNumber="photo.fixedNumber"
  64. :outputSize="photo.size"
  65. :outputType="photo.outputType"
  66. ></vueCropper>
  67. </div>
  68. </div>
  69. <div slot="footer" class="dialog-footer">
  70. <el-button @click="cropperVisible = false">取 消</el-button>
  71. <el-button type="primary" @click="finish">确认</el-button>
  72. </div>
  73. </el-dialog>
  74. </div>
  75. </template>
  76. <script>
  77. import cityArr from './citydata.js'
  78. export default {
  79. data(){
  80. var telRexEx = (rule, value, callback) => {
  81. if (value) {
  82. if(!(/^1[3456789]\d{9}$/.test(value))){
  83. callback(new Error('手机号码有误,请重填'));
  84. return false;
  85. }else{
  86. callback();
  87. }
  88. } else {
  89. // callback(new Error('请输入联系方式'));
  90. callback();
  91. }
  92. };
  93. var emailRexEx = (rule, value, callback) => {
  94. if (value) {
  95. if(!(/^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(value))){
  96. callback(new Error('邮箱有误,请重填'));
  97. return false;
  98. }else{
  99. callback();
  100. }
  101. }else{
  102. callback();
  103. }
  104. };
  105. return {
  106. userMsg:{
  107. ret:'',
  108. mobile:'',
  109. province:'',
  110. city:'',
  111. district:'',
  112. image:'',
  113. email:'',
  114. username:''
  115. },
  116. cityValue:[],
  117. options: cityArr,
  118. props: {
  119. expandTrigger: 'hover',
  120. value:'value',
  121. },
  122. cropperVisible: false,
  123. // 裁剪组件的基础配置option
  124. photo: {
  125. img:'', // 裁剪图片的地址
  126. info: true, // 裁剪框的大小信息
  127. outputSize: 0.8, // 裁剪生成图片的质量
  128. outputType: 'jpeg', // 裁剪生成图片的格式
  129. // canScale: false, // 图片是否允许滚轮缩放
  130. // autoCrop: true, // 是否默认生成截图框
  131. // autoCropWidth: 300, // 默认生成截图框宽度
  132. // autoCropHeight: 200, // 默认生成截图框高度
  133. // fixedBox: true, // 固定截图框大小 不允许改变
  134. fixed: true, // 是否开启截图框宽高固定比例
  135. fixedNumber: [1, 1], // 截图框的宽高比例
  136. full: true, // 是否输出原图比例的截图
  137. canMoveBox: false, // 截图框能否拖动
  138. original: false, // 上传图片按照原始比例渲染
  139. centerBox: false, // 截图框是否被限制在图片里面
  140. infoTrue: true // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
  141. },
  142. // 表单验证
  143. editUserMsgRules: {
  144. mobile: [
  145. { validator: telRexEx, trigger: 'blur' }
  146. ],
  147. email: [
  148. { validator: emailRexEx, trigger: 'blur' }
  149. ]
  150. },
  151. }
  152. },
  153. created(){
  154. this.getRoleList()
  155. },
  156. mounted(){
  157. // this.getRoleList()
  158. },
  159. methods:{
  160. resetForm() {
  161. this.$refs.userMsgRef.resetFields();
  162. },
  163. getRoleList(){
  164. let that = this;
  165. this.$axios({
  166. method:'POST',
  167. url:'/api/api_gateway?method=home.homes.personal_center',
  168. data:this.qs.stringify({username:localStorage.getItem('username')})
  169. }).then(res=>{
  170. if(res.data.message==""){
  171. that.userMsg=res.data.data;
  172. that.cityValue = [res.data.data.province,res.data.data.city,res.data.data.district]
  173. }
  174. })
  175. },
  176. saveUserMsg(){
  177. this.$refs.userMsgRef.validate((valid) => {
  178. console.log(11111)
  179. if (valid) {
  180. this.userMsg.ret = 'change'
  181. this.$axios({
  182. method:'POST',
  183. url:'/api/api_gateway?method=home.homes.personal_center',
  184. data:this.qs.stringify(this.userMsg)
  185. }).then(res=>{
  186. if(res.data.message==""){
  187. this.$message.success('修改成功!')
  188. }else{
  189. this.$message.error('修改失败!')
  190. }
  191. })
  192. } else {
  193. return false
  194. }
  195. })
  196. },
  197. // 上传按钮 限制图片大小
  198. changeUpload(file, fileList) {
  199. const isLt4M = file.size / 1024 / 1024 < 4
  200. if (!isLt4M) {
  201. this.$message.error('上传文件大小不能超过 4MB!')
  202. return false
  203. }
  204. // 上传成功后将图片地址赋值给裁剪框显示图片
  205. this.$nextTick(() => {
  206. this.photo.img = URL.createObjectURL(file.raw)
  207. this.cropperVisible = true
  208. })
  209. },
  210. // 点击裁剪,这一步是可以拿到处理后的地址
  211. finish() {
  212. // 获取截图的base64 数据
  213. this.$refs.cropper.getCropBlob((data) => {
  214. var form = new FormData()
  215. let resFile = this.blobToFile(data, 'filename.jpg');
  216. form.append('image', resFile)
  217. form.append('username', localStorage.getItem('username'))
  218. this.cropperVisible = false
  219. this.$axios({
  220. method: 'POST',
  221. url: '/api/api_gateway?method=home.homes.personal_photo',
  222. data: form
  223. }).then((res) => {
  224. if (res.data.data.src != 0 && res.data.message == '') {
  225. this.userMsg.image = `/api/${res.data.data.src}`
  226. }else{
  227. this.$message({
  228. message: '上传失败',
  229. type: 'error'
  230. })
  231. }
  232. })
  233. })
  234. },
  235. //转成file
  236. blobToFile(Blob, fileName) {
  237. Blob.lastModifiedDate = new Date();
  238. Blob.name = fileName;
  239. return Blob;
  240. },
  241. handleChange(value) {
  242. console.log(value)
  243. console.log(this.cityValue)
  244. this.userMsg.province = value[0]
  245. this.userMsg.city = value[1]
  246. this.userMsg.district = value[2]
  247. }
  248. }
  249. }
  250. </script>
  251. <style lang='less' scoped>
  252. .card{
  253. min-height: 80vh;
  254. .form{
  255. // width: 50%;
  256. // 头像上传
  257. .avatar-uploader .el-upload {
  258. border: 1px dashed #d9d9d9;
  259. border-radius: 6px;
  260. cursor: pointer;
  261. position: relative;
  262. overflow: hidden;
  263. }
  264. .avatar-uploader .el-upload:hover {
  265. border-color: #409EFF;
  266. }
  267. .avatar-uploader-icon {
  268. font-size: 28px;
  269. color: #8c939d;
  270. width: 150px;
  271. height: 150px;
  272. line-height: 150px !important;
  273. text-align: center;
  274. }
  275. .avatar {
  276. width: 178px;
  277. height: 178px;
  278. display: block;
  279. }
  280. .hint{
  281. font-size: 12px;
  282. color: #707070;
  283. }
  284. .el-input{
  285. width: 220px;
  286. }
  287. }
  288. }
  289. </style>