1.VUE2图片上传封装
使用
- <ImageUpload v-model="picUrl" :fileSize="0" @getImg="getImg"></ImageUpload>
复制代码 封装代码
- <template>
- <div class="component-upload-image">
- <el-upload
- multiple
- :action="uploadImgUrl"
- list-type="picture-card"
- :on-success="handleUploadSuccess"
- :before-upload="handleBeforeUpload"
- :limit="limit"
- :on-error="handleUploadError"
- :on-exceed="handleExceed"
- ref="imageUpload"
- :on-remove="handleDelete"
- :show-file-list="true"
- :headers="headers"
- :file-list="fileList"
- :on-preview="handlePictureCardPreview"
- :class="{hide: this.fileList.length >= this.limit}"
- >
- <i class="el-icon-plus"></i>
- </el-upload>
- <!-- 上传提示 -->
- <div class="el-upload__tip" slot="tip" v-if="showTip">
- 请上传
- <template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
- <template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
- 的文件
- </div>
- <el-dialog
- :visible.sync="dialogVisible"
- title="预览"
- width="800"
- append-to-body
- >
- <img
- :src="dialogImageUrl"
- style="display: block; max-width: 100%; margin: 0 auto"
- />
- </el-dialog>
- </div>
- </template>
- <script>
- import { getToken } from "@/utils/auth";
- import { listByIds, delOss } from "@/api/system/oss";
- export default {
- props: {
- value: [String, Object, Array],
- // 图片数量限制
- limit: {
- type: Number,
- default: 5,
- },
- // 大小限制(MB)
- fileSize: {
- type: Number,
- default: 5,
- },
- // 文件类型, 例如['png', 'jpg', 'jpeg']
- fileType: {
- type: Array,
- default: () => ["png", "jpg", "jpeg"],
- },
- // 是否显示提示
- isShowTip: {
- type: Boolean,
- default: true
- }
- },
- data() {
- return {
- number: 0,
- uploadList: [],
- dialogImageUrl: "",
- dialogVisible: false,
- hideUpload: false,
- baseUrl: process.env.VUE_APP_BASE_API,
- uploadImgUrl: process.env.VUE_APP_BASE_API + "/system/oss/upload", // 上传的图片服务器地址
- headers: {
- Authorization: "Bearer " + getToken(),
- },
- fileList: []
- };
- },
- watch: {
- value: {
- async handler(val) {
- if (val) {
- // 首先将值转为数组
- let list;
- if (Array.isArray(val)) {
- list = val;
- } else {
- await listByIds(val).then(res => {
- list = res.data;
- this.$emit("getImg", list);
- })
- }
- // 然后将数组转为对象数组
- this.fileList = list.map(item => {
- // 此处name使用ossId 防止删除出现重名
- item = { name: item.ossId, url: item.url, ossId: item.ossId };
- return item;
- });
- } else {
- this.fileList = [];
- return [];
- }
- },
- deep: true,
- immediate: true
- }
- },
- computed: {
- // 是否显示提示
- showTip() {
- return this.isShowTip && (this.fileType || this.fileSize);
- },
- },
- methods: {
- // 上传前loading加载
- handleBeforeUpload(file) {
- let isImg = false;
- if (this.fileType.length) {
- let fileExtension = "";
- if (file.name.lastIndexOf(".") > -1) {
- fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
- }
- isImg = this.fileType.some((type) => {
- if (file.type.indexOf(type) > -1) return true;
- if (fileExtension && fileExtension.indexOf(type) > -1) return true;
- return false;
- });
- } else {
- isImg = file.type.indexOf("image") > -1;
- }
- if (!isImg) {
- this.$modal.msgError(`文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`);
- return false;
- }
- if (this.fileSize) {
- const isLt = file.size / 1024 / 1024 < this.fileSize;
- if (!isLt) {
- this.$modal.msgError(`上传头像图片大小不能超过 ${this.fileSize} MB!`);
- return false;
- }
- }
- this.$modal.loading("正在上传图片,请稍候...");
- this.number++;
- },
- // 文件个数超出
- handleExceed() {
- this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);
- },
- // 上传成功回调
- handleUploadSuccess(res, file) {
- if (res.code === 200) {
- this.uploadList.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId });
- this.uploadedSuccessfully();
- } else {
- this.number--;
- this.$modal.closeLoading();
- this.$modal.msgError(res.msg);
- this.$refs.imageUpload.handleRemove(file);
- this.uploadedSuccessfully();
- }
- },
- // 删除图片
- handleDelete(file) {
- const findex = this.fileList.map(f => f.name).indexOf(file.name);
- if(findex > -1) {
- let ossId = this.fileList[findex].ossId;
- // delOss(ossId);
- this.fileList.splice(findex, 1);
- this.$emit("input", this.listToString(this.fileList));
- }
- },
- // 上传失败
- handleUploadError(res) {
- this.$modal.msgError("上传图片失败,请重试");
- this.$modal.closeLoading();
- },
- // 上传结束处理
- uploadedSuccessfully() {
- if (this.number > 0 && this.uploadList.length === this.number) {
- this.fileList = this.fileList.concat(this.uploadList);
- this.uploadList = [];
- this.number = 0;
- this.$emit("input", this.listToString(this.fileList));
- this.$modal.closeLoading();
- }
- },
- // 预览
- handlePictureCardPreview(file) {
- this.dialogImageUrl = file.url;
- this.dialogVisible = true;
- },
- // 对象转成指定字符串分隔
- listToString(list, separator) {
- let strs = "";
- separator = separator || ",";
- for (let i in list) {
- if (list[i].ossId) {
- strs += list[i].ossId + separator;
- }
- }
- return strs != "" ? strs.substr(0, strs.length - 1) : "";
- }
- }
- };
- </script>
- <style scoped lang="scss">
- // .el-upload--picture-card 控制加号部分
- ::v-deep.hide .el-upload--picture-card {
- display: none;
- }
- // 去掉动画效果
- ::v-deep .el-list-enter-active,
- ::v-deep .el-list-leave-active {
- transition: all 0s;
- }
- ::v-deep .el-list-enter, .el-list-leave-active {
- opacity: 0;
- transform: translateY(0);
- }
- </style>
复制代码 2.文件上传封装
使用
- <FileUpload v-model="fileIds" :fileSize="0" @getfile="getfile"></FileUpload>
复制代码 封装代码
- <template>
- <div class="upload-file">
- <el-upload
- v-if="isUpload"
- multiple
- :action="uploadFileUrl"
- :before-upload="handleBeforeUpload"
- :file-list="fileList"
- :limit="limit"
- :on-error="handleUploadError"
- :on-exceed="handleExceed"
- :on-success="handleUploadSuccess"
- :show-file-list="false"
- :headers="headers"
- class="upload-file-uploader"
- ref="fileUpload"
- >
- <!-- 上传按钮 -->
- <el-button size="mini" type="primary">选取文件</el-button>
- <!-- 上传提示 -->
- <div class="el-upload__tip" slot="tip" v-if="showTip">
- 请上传
- <template v-if="fileSize">
- 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
- </template>
- <template v-if="fileType">
- 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
- </template>
- 的文件
- </div>
- </el-upload>
- <!-- 文件列表 -->
- <transition-group
- class="upload-file-list el-upload-list el-upload-list--text"
- name="el-fade-in-linear"
- tag="ul"
- v-if="isFileList"
- >
- <li
- :key="file.url"
- class="el-upload-list__item ele-upload-list__item-content"
- style="padding: 0 4px"
- v-for="(file, index) in fileList"
- >
- <el-link :href="`${file.url}`" :underline="false" target="_blank">
- <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
- </el-link>
- <div class="ele-upload-list__item-content-action" v-if="isUpload">
- <el-link :underline="false" @click="handleDelete(index)" type="danger"
- >删除</el-link
- >
- </div>
- </li>
- </transition-group>
- </div>
- </template>
- <script>
- import { getToken } from "@/utils/auth";
- import { listByIds, delOss } from "@/api/system/oss";
- export default {
- name: "FileUpload",
- props: {
- // 值
- value: [String, Object, Array],
- // 数量限制
- limit: {
- type: Number,
- default: 5,
- },
- // 大小限制(MB)
- fileSize: {
- type: Number,
- default: 5,
- },
- // 文件类型, 例如['png', 'jpg', 'jpeg']
- fileType: {
- type: Array | Boolean,
- // default: () => ["doc", "xls", "ppt", "txt", "pdf"],
- default: () => ["doc", "docx", "xls", "xlsx", "ppt", ".pptx", "pdf"],
- },
- // 是否显示提示
- isShowTip: {
- type: Boolean,
- default: true,
- },
- // 是否显示文件列表
- isFileList: {
- type: Boolean,
- default: true,
- },
- dataIndex: {
- type: Number | String,
- default: 0,
- },
- // 是否可以上传
- isUpload: {
- type: Boolean,
- default: true,
- },
- },
- data() {
- return {
- number: 0,
- uploadList: [],
- baseUrl: process.env.VUE_APP_BASE_API,
- uploadFileUrl: process.env.VUE_APP_BASE_API + "/system/oss/upload", // 上传文件服务器地址
- headers: {
- Authorization: "Bearer " + getToken(),
- },
- fileList: [],
- };
- },
- watch: {
- value: {
- async handler(val) {
- if (val) {
- let temp = 1;
- // 首先将值转为数组
- let list;
- if (Array.isArray(val)) {
- list = val;
- } else {
- console.log(val);
- await listByIds(val).then((res) => {
- list = res.data.map((oss) => {
- oss = {
- name: oss.originalName,
- url: oss.url,
- ossId: oss.ossId,
- };
- return oss;
- });
- this.$emit("getfile", list, this.dataIndex);
- });
- }
- // 然后将数组转为对象数组
- this.fileList = list.map((item) => {
- item = { name: item.name, url: item.url, ossId: item.ossId };
- item.uid = item.uid || new Date().getTime() + temp++;
- return item;
- });
- } else {
- this.fileList = [];
- return [];
- }
- },
- deep: true,
- immediate: true,
- },
- },
- computed: {
- // 是否显示提示
- showTip() {
- return this.isShowTip && (this.fileType || this.fileSize);
- },
- },
- methods: {
- // 上传前校检格式和大小
- handleBeforeUpload(file) {
- // 校检文件类型
- if (this.fileType) {
- const fileName = file.name.split(".");
- const fileExt = fileName[fileName.length - 1];
- const isTypeOk = this.fileType.indexOf(fileExt) >= 0;
- if (!isTypeOk) {
- this.$modal.msgError(
- `文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
- );
- return false;
- }
- }
- // 校检文件大小
- if (this.fileSize) {
- const isLt = file.size / 1024 / 1024 < this.fileSize;
- if (!isLt) {
- this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
- return false;
- }
- }
- this.$modal.loading("正在上传文件,请稍候...");
- this.number++;
- return true;
- },
- // 文件个数超出
- handleExceed() {
- this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);
- },
- // 上传失败
- handleUploadError(err) {
- this.$modal.msgError("上传文件失败,请重试");
- this.$modal.closeLoading();
- },
- // 上传成功回调
- handleUploadSuccess(res, file) {
- if (res.code === 200) {
- this.uploadList.push({
- name: res.data.fileName,
- url: res.data.url,
- ossId: res.data.ossId,
- });
- this.uploadedSuccessfully();
- } else {
- this.number--;
- this.$modal.closeLoading();
- this.$modal.msgError(res.msg);
- this.$refs.fileUpload.handleRemove(file);
- this.uploadedSuccessfully();
- }
- },
- // 删除文件
- handleDelete(index) {
- let ossId = this.fileList[index].ossId;
- // delOss(ossId);
- this.fileList.splice(index, 1);
- this.$emit("input", this.listToString(this.fileList));
- },
- // 上传结束处理
- uploadedSuccessfully() {
- if (this.number > 0 && this.uploadList.length === this.number) {
- this.fileList = this.fileList.concat(this.uploadList);
- this.uploadList = [];
- this.number = 0;
- this.$emit("input", this.listToString(this.fileList));
- this.$modal.closeLoading();
- }
- },
- // 获取文件名称
- getFileName(name) {
- // 如果是url那么取最后的名字 如果不是直接返回
- if (name.lastIndexOf("/") > -1) {
- return name.slice(name.lastIndexOf("/") + 1);
- } else {
- return name;
- }
- },
- // 对象转成指定字符串分隔
- listToString(list, separator) {
- let strs = "";
- separator = separator || ",";
- for (let i in list) {
- strs += list[i].ossId + separator;
- }
- return strs != "" ? strs.substr(0, strs.length - 1) : "";
- },
- },
- };
- </script>
- <style scoped lang="scss">
- .upload-file-uploader {
- margin-bottom: 5px;
- }
- .upload-file-list .el-upload-list__item {
- border: 1px solid #e4e7ed;
- line-height: 2;
- margin-bottom: 10px;
- position: relative;
- }
- .upload-file-list .ele-upload-list__item-content {
- display: flex;
- justify-content: space-between;
- align-items: center;
- color: inherit;
- }
- .ele-upload-list__item-content-action .el-link {
- margin-right: 10px;
- }
- </style>
复制代码 3.图片回显
使用
- <ImagePreview :src="content.picUrl" :width="150" :height="150"></ImagePreview>
复制代码 封装代码
- <template>
- <div>
- <el-image v-for="(item,index) in realSrcList" :key="index"
- :src="`${item}`"
- fit="cover"
- :style="`width:${realWidth};height:${realHeight};`"
- :preview-src-list="realSrcList"
- >
- <div slot="error" class="image-slot">
- <i class="el-icon-picture-outline"></i>
- </div>
- </el-image>
- </div>
- </template>
- <script>
- export default {
- name: "ImagePreview",
- props: {
- src: {
- type: String,
- default: ""
- },
- width: {
- type: [Number, String],
- default: ""
- },
- height: {
- type: [Number, String],
- default: ""
- }
- },
- computed: {
- realSrc() {
- if (!this.src) {
- return;
- }
- let real_src = this.src.split(",")[0];
- return real_src;
- },
- realSrcList() {
- if (!this.src) {
- return;
- }
- let real_src_list = this.src.split(",");
- let srcList = [];
- real_src_list.forEach(item => {
- return srcList.push(item);
- });
- return srcList;
- },
- realWidth() {
- return typeof this.width == "string" ? this.width : `${this.width}px`;
- },
- realHeight() {
- return typeof this.height == "string" ? this.height : `${this.height}px`;
- }
- },
- };
- </script>
- <style lang="scss" scoped>
- .el-image {
- border-radius: 5px;
- background-color: #ebeef5;
- box-shadow: 0 0 5px 1px #ccc;
- ::v-deep .el-image__inner {
- transition: all 0.3s;
- cursor: pointer;
- &:hover {
- transform: scale(1.2);
- }
- }
- ::v-deep .image-slot {
- display: flex;
- justify-content: center;
- align-items: center;
- width: 100%;
- height: 100%;
- color: #909399;
- font-size: 30px;
- }
- }
- </style>
复制代码 4.文件回显
使用
- <FileUpload v-model="content.fileIds" :isShowTip="false" :fileType="false" :isUpload="false"></FileUpload>
复制代码 5.树形封装
使用
- <orginTree v-model="form.deptId" @getdep="getdep"></orginTree>
复制代码 组件封装代码
- <template>
- <div>
- <a-tree-select
- v-model="orgId"
- style="width: 100%"
- size="large"
- :dropdown-style="{ maxHeight: '400px', overflow: 'auto', zIndex: 3000 }"
- placeholder="请选择"
- allow-clear
- tree-default-expand-all
- :disabled="disabled"
- :tree-data="vorganTreeData"
- :replaceFields="replaceFields"
- @change="onChange"
- >
- </a-tree-select>
- </div>
- </template>
- <script>
- //注意!!!!!
- //在modal弹窗组件中使用该组件需要在关闭弹窗方法里清空数据否则会报错
- import { userdepList } from "@/api/user/user";
- export default {
- name: "vorganTree",
- props: {
- value: {
- // 如果希望value可以接收int类型的值而不报错,可以将type类型修改为可以兼容字符串和整数的类型
- type: [String, Number],
- default: "",
- },
- disabled: {
- type: Boolean,
- default: false,
- },
- replaceFields: {
- type: Object,
- default: () => {
- return {
- children: "children",
- title: "label",
- key: "id",
- value: "id",
- };
- },
- },
- },
- data() {
- return {
- orgId: this.value,
- vorganTreeData: [],
- deptId: "",
- };
- },
- watch: {
- value: {
- handler(newVal) {
- this.orgId = newVal;
- },
- immediate: true,
- },
- },
- mounted() {
- // this.$bus.$on("id", (data) => {
- // console.log("我是任务组件,收到了数据", data);
- // this.deptId = data;
- // });
- this.deptId = this.$bus.id;
- this.userdepList();
- },
- methods: {
- userdepList() {
- userdepList({ ancestors: this.deptId }).then((res) => {
- console.log("res.data", res);
- this.vorganTreeData = res.data;
- });
- },
- selectClear() {
- this.orgId = undefined;
- },
- onChange(value, item, xx) {
- console.log(11111, value, item, xx);
- // this.$emit("update:value", value);
- this.$emit("getdep", value);
- },
- },
- };
- </script>
- <style scoped lang="less">
- </style>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |