vue 头像 上传 裁剪

<template>

  <div>

    <el-breadcrumb

      style="margin:20px 0 0 20px"

      separator-class="el-icon-arrow-right"

    >

      <el-breadcrumb-item>账号中心</el-breadcrumb-item>

      <el-breadcrumb-item>基本信息</el-breadcrumb-item>

    </el-breadcrumb>

    <el-card shadow="hover" class="card" style="margin-top:20px">

      <div class="left">

        <div class="pic">

          <el-image :src="gerenuserInfos.headUrl"></el-image>

          <div class="xiugai" @click="modify">修改</div>

        </div>

      </div>

      <el-descriptions style="margin-left:30px">

    <el-descriptions-item label="用户姓名:">{{ gerenuserInfos.userName }}</el-descriptions-item>

    <el-descriptions-item label="手机号:">{{ gerenuserInfos.mobilPhone }}</el-descriptions-item>

    <el-descriptions-item label="身份证:">{{ gerenuserInfos.cardNo }}</el-descriptions-item>

    <el-descriptions-item label="邮箱:">

      {{ gerenuserInfos.email }}

    </el-descriptions-item>

</el-descriptions>

      <!-- <div class="middle">

        <div class="accountNumber">

          用户姓名:&nbsp;&nbsp;&nbsp;

          <div style="font-weight:bold;margin-left:26px">{{ gerenuserInfos.userName }}</div>

        </div>

        <div class="phone">

          手机号:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

          <div style="font-weight:bold;margin-left:40px">{{ gerenuserInfos.mobilPhone }}</div>

        </div>

        <div class="accountNumber">

          身份证:&nbsp;&nbsp;&nbsp;

          <div style="font-weight:bold;margin-left:40px">{{ gerenuserInfos.cardNo }}</div>

        </div>

        <div class="phone">

          邮箱:&nbsp;&nbsp;&nbsp;

          <div style="font-weight:bold;margin-left:56px">{{ gerenuserInfos.email }}</div>

        </div>

      </div> -->

      <!-- <div class="right">

        <div class="accountNumber">

          身份证:

          <div >{{ gerenuserInfos.cardNo }}</div>

        </div>

        <div class="phone">

          邮箱:

          <div >{{ gerenuserInfos.email }}</div>

        </div>

      </div> -->

      <el-button

        type="primary"

        icon="el-icon-edit"

        plain

        class="btn"

        size="small"

        @click="EditInformation"

        >编辑信息</el-button

      >

    </el-card>

    <el-dialog

      title="编辑信息"

      :visible.sync="dialogVisible"

      width="30%"

      @close="btnCancel"

    >

      <el-form

        :model="UserInfo"

        label-width="120px"

        :rules="rules"

        ref="ruleForm"

      >

        <el-form-item label="用户姓名:">

          <el-input v-model="UserInfo.userName" disabled></el-input>

        </el-form-item>

        <el-form-item label="手机号:" prop="mobilPhone">

          <el-input

            v-model="UserInfo.mobilPhone"

            οnkeyup="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}"

            onafterpaste="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}"

          ></el-input>

        </el-form-item>

        <el-form-item label="身份证:" prop="cardNo">

          <el-input

            v-model="UserInfo.cardNo"

            οnkeyup="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}"

            onafterpaste="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}"

          ></el-input>

        </el-form-item>

        <el-form-item label="邮箱:" prop="email">

          <el-input v-model="UserInfo.email"></el-input>

        </el-form-item>

      </el-form>

      <span slot="footer" class="dialog-footer">

        <el-button @click="btnCancel">取 消</el-button>

        <el-button type="primary" @click="btnOk">确 定</el-button>

      </span>

    </el-dialog>

    <!-- 头像编辑 -->

    <el-dialog title="编辑头像" :visible.sync="imgDialog">

      <div style="min-width: 540px;width:600px;">

        <div class="eleme">

          <el-upload

            class="upload-demo"

            ref="upload"

            action="#"

            :before-upload="beforeUpload"

            :on-preview="handlePreview"

            :on-remove="handleRemove"

            :auto-upload="true"

       

            :show-file-list="false"

          >

          <!--     :on-success="SuccessFlie" -->

            <el-button slot="trigger" size="small" type="primary"

              >选择图片</el-button

            >

            <el-button

              style="margin-left: 10px;"

              size="small"

              type="success"

              @click="submitUpload"

              >上传头像</el-button

            >

          </el-upload>

        </div>

        <div></div>

        <div class="cropper">

          <div

            class="cropper-content"

            style="margin-top:30px;margin-left:30px;"

          >

            <div class="cropper">

              <vueCropper

                ref="cropper"

                :img="option.img"

                :outputSize="option.size"

                :outputType="option.outputType"

                :info="true"

                :full="option.full"

                :canMove="option.canMove"

                :canMoveBox="option.canMoveBox"

                :original="option.original"

                :autoCrop="option.autoCrop"

                :autoCropWidth="option.autoCropWidth"

                :autoCropHeight="option.autoCropHeight"

                :fixedBox="option.fixedBox"

                @realTime="realTime"

                @imgLoad="imgLoad"

              ></vueCropper>

            </div>

            <!-- <div style="margin-left:20px;">

              <div

                class="show-preview"

                :style="{

                  width: '150px',

                  height: '155px',

                  overflow: 'hidden',

                  margin: '5px'

                }"

              ></div>

            </div> -->

          </div>

        </div>

      </div>

    </el-dialog>

  </div>

</template>

<script>

import VueCropper from 'vue-cropper'

Vue.use(VueCropper);

import { Aside } from "element-ui";

import { queryBaseUserInfo, updateBaseUserInfo, uploadHead } from "./api.js";

export default {

  data() {

    // 身份证号校验

    var checkIdNum = (rule, value, callback) => {

      const reg = /(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)/;

      if (!value) {

        return callback(new Error("证件号码不能为空"));

      } else if (!reg.test(value)) {

        return callback(new Error("证件号码不正确"));

      } else {

        callback();

      }

    };

    // 检验邮箱

    var checkEmail = (rule, value, cb) => {

      const regEmail = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/;

      if (regEmail.test(value)) {

        // 合法的邮箱

        return cb();

      }

      cb(new Error("请输入合法的邮箱"));

    };

    // 校验手机号

    var checkMobile = (rule, value, cb) => {

      const regMobile = /^(0|86|17951)?(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$/;

      if (regMobile.test(value)) {

        // 合法的手机号码

        return cb();

      }

      cb(new Error("手机号码格式不正确"));

    };

    return {

      gerenuserInfos: {}, //  用户个人信息

      option: {

        img: "",

        outputSize: 1, //剪切后的图片质量(0.1-1)

        full: false, //输出原图比例截图 props名full

        outputType: "png",

        canMove: true,

        original: false,

        canMoveBox: true,

        autoCrop: true,

        autoCropWidth: 150,

        autoCropHeight: 150,

        fixedBox: false

      },

      fileName: "",

      imgUrl: "", // 图片路径

      previews: {}, //实时预览图数据

      attach: {

        //后端附件表

        id: "",

        userId: "",

        customaryUrl: "", //原图片路径

        laterUrl: "", //裁剪后图片路径  /static/logo.png

        attachType: "photo" //附件类型

      },

      dialogVisible: false, //  弹层信息

      imgDialog: false, //  头像裁剪弹层

      UserInfo: {

        userName: "", // 用户姓名

        operatorId: "",

        mobilPhone: "", //  电话号码

        cardNo: "", //  身份证号码

        email: "" // 邮箱

      },

      fileList: {},

      rules: {

        mobilPhone: [

          { required: true, message: "手机号不能为空", trigger: "blur" },

          {

            validator: checkMobile,

            trigger: "blur"

          }

        ],

        cardNo: [

          { required: true, message: "身份证不能为空", trigger: "blur" },

          {

            validator: checkIdNum,

            trigger: "blur"

          }

        ],

        email: [

          { required: true, message: "邮箱不能为空", trigger: "blur" },

          {

            validator: checkEmail,

            trigger: "blur"

          }

        ]

      }

    };

  },

  created() {

   

  },

  mounted() {

 this.getUserInfo();

  },

  methods: {

    SuccessFlie(res) {

console.log(res);

    },

    //  获取用户基本信息

    async getUserInfo() {

      const res = await queryBaseUserInfo();

      if (res.recode == 200) {

        this.gerenuserInfos = res.redata;

        console.log(res);

      } else {

        this.$message.warning("请求失败,请稍后重试");

      }

    },

    submitUpload(file) {

      // this.$refs.upload.submit();

      this.finish("blob");

    },

    handleRemove(file, fileList) {

      console.log(file, fileList);

    },

    handlePreview(file) {

      console.log(file);

    },

    beforeUpload(file) {

      this.fileList = file;

      console.log(file);

      let data = window.URL.createObjectURL(new Blob([file]));

      this.fileName = file.name;

      this.option.img = data;

    },

    //放大/缩小

    changeScale(num) {

      console.log("changeScale");

      num = num || 1;

      this.$refs.cropper.changeScale(num);

    },

    //坐旋转

    rotateLeft() {

      console.log("rotateLeft");

      this.$refs.cropper.rotateLeft();

    },

    //右旋转

    rotateRight() {

      console.log("rotateRight");

      this.$refs.cropper.rotateRight();

    },

    //上传图片(点击上传按钮)

    finish(type) {

      let _this = this;

      let formData = new FormData();

      formData.append("file", this.fileList);

      // 输出

      if (type === "blob") {

        this.$refs.cropper.getCropBlob(data => {

          console.log(this.fileList);

          let img = window.URL.createObjectURL(data);

          this.model = true;

          this.modelSrc = img;

        });

        console.log(formData);

        uploadHead(formData).then(res => {

          if (res.recode == 200) {

            this.getUserInfo();

            this.imgDialog = false;

            this.$message.success("操作成功");

          } else {

            this.$message.warning("操作失败,请稍后重试");

          }

          console.log(res);

        });

      } else {

        this.$refs.cropper.getCropData(data => {

          this.model = true;

          this.modelSrc = data;

        });

      }

    },

    // 实时预览函数

    realTime(data) {

      console.log("realTime");

      this.previews = data;

    },

    imgLoad(msg) {

      console.log("imgLoad");

      console.log(msg);

    },

    modify() {

      this.imgDialog = true;

    },

    handleClose() {

      this.imgDialog = false;

    },

    async EditInformation() {

      this.UserInfo = this.gerenuserInfos;

      this.dialogVisible = true;

    },

    btnCancel() {

      this.$refs.ruleForm.resetFields();

      this.dialogVisible = false;

    },

    btnOk() {

   

      this.$refs.ruleForm.validate(async isOk => {

        if (isOk) {

          //  修改用户基本信息

          const res = await updateBaseUserInfo(this.UserInfo);

          if (res.recode == 200) {

            this.getUserInfo();

            this.dialogVisible = false;

            this.$message.success("修改成功");

          } else {

            this.$message.warning("操作失败,请稍后重试");

          }

        } else {

          this.$message.warning("请检查你的信息是否填写完整");

        }

      });

    }

  }

};

</script>

<style lang="less" scoped>

/deep/.el-card {

  margin: 20px 0 0 20px;

}

.cropper-content {

  min-width: 540px;

  display: flex;

  .cropper {

    width: 260px;

    height: 260px;

  }

  .show-preview {

    flex: 1;

    -webkit-flex: 1;

    display: flex;

    display: -webkit-flex;

    justify-content: center;

    -webkit-justify-content: center;

    .preview {

      overflow: hidden;

      border-radius: 50%;

      border: 1px solid #cccccc;

      background: #cccccc;

      margin-left: 40px;

    }

  }

}

.cropper-content .show-preview .preview {

  margin-left: 0;

  -moz-user-select: none;

  -webkit-user-select: none;

  -ms-user-select: none;

  -khtml-user-select: none;

  user-select: none;

}

.el-dialog {

  width: 700px !important;

  height: auto;

}

.show-preview {

  display: flex;

  justify-content: center;

}

.preview {

  border-radius: 50%;

  overflow: hidden;

  border: 1px solid #cccccc;

  background: #cccccc;

  width: 150px !important;

  height: 150px !important;

  margin-left: 50px;

  margin-top: 50px;

}

.upload-img {

  width: 100px;

  height: 30px;

  border: 1px solid #f08512;

  margin-bottom: 5px;

  line-height: 30px;

  text-align: center;

  cursor: pointer;

}

.footerBtn {

  display: flex;

  justify-content: center;

  margin-top: 15px;

}

* {

  margin: 0;

  padding: 0;

  box-sizing: border-box;

}

/deep/.el-dialog__footer {

  text-align: center;

}

.btn {

  background-color: skyblue;

  position: absolute;

  right: 10px;

  bottom: 10px;

}

.middle {

  display: flex;

  flex-direction: column;

  justify-content: space-around;

  margin-left: 150px;

  .accountNumber {

    display: flex;

    margin-right: 30px;

  }

  .phone {

    display: flex;

    margin-right: 30px;

  }

}

.right {

  display: flex;

  flex-direction: column;

  justify-content: space-around;

  .accountNumber {

    display: flex;

    margin-right: 30px;

  }

  .phone {

    display: flex;

    margin-right: 30px;

  }

}

/deep/.el-card__body {

  display: flex;

align-items: center;

  position: relative;

}

.pic {

  position: relative;

  margin-left: 32px;

  height: 116px;

  width: 116px;

  position: relative;

  text-align: center;

  border-radius: 50%;

  overflow: hidden;

  .xiugai {

    width: 100%;

    height: 31px;

    opacity: 0.75;

    background: rgb(24, 24, 24);

    position: absolute;

    bottom: 0px;

    font-size: 12px;

    color: rgb(255, 255, 255);

    text-align: center;

    line-height: 31px;

    cursor: pointer;

  }

  .el-image {

    width: 100%;

    height: 100%;

    border-radius: 50%;

  }

}

</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值