123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609 |
- "use strict";
- const common_vendor = require("../../../common/vendor.js");
- const sheep_components_sUploader_chooseAndUploadFile = require("./choose-and-upload-file.js");
- const sheep_components_sUploader_utils = require("./utils.js");
- const sheep_index = require("../../index.js");
- require("../../api/infra/file.js");
- require("../../config/index.js");
- require("../../request/index.js");
- require("../../store/index.js");
- require("../../store/app.js");
- require("../../api/promotion/diy.js");
- require("../../platform/index.js");
- require("../../platform/provider/wechat/index.js");
- require("../../platform/provider/wechat/miniProgram.js");
- require("../../api/member/auth.js");
- require("../../api/member/social.js");
- require("../../api/member/user.js");
- require("../../platform/provider/apple/index.js");
- require("../../platform/share.js");
- require("../../router/index.js");
- require("../../hooks/useModal.js");
- require("../../helper/index.js");
- require("../../helper/test.js");
- require("../../helper/digit.js");
- require("../../api/member/signin.js");
- require("../../helper/throttle.js");
- require("../../url/index.js");
- require("../../platform/pay.js");
- require("../../api/pay/order.js");
- require("../../store/user.js");
- require("../../store/cart.js");
- require("../../api/trade/cart.js");
- require("../../api/pay/wallet.js");
- require("../../api/trade/order.js");
- require("../../api/promotion/coupon.js");
- require("../../store/sys.js");
- require("../../store/modal.js");
- require("../../api/index.js");
- require("../../api/distri/score.js");
- require("../../api/distri/share.js");
- require("../../api/distri/team.js");
- require("../../api/member/address.js");
- require("../../api/member/point.js");
- require("../../api/migration/app.js");
- require("../../api/migration/chat.js");
- require("../../api/migration/index.js");
- require("../../api/migration/third.js");
- require("../../api/pay/channel.js");
- require("../../api/product/category.js");
- require("../../api/product/comment.js");
- require("../../api/product/favorite.js");
- require("../../api/product/history.js");
- require("../../api/product/spu.js");
- require("../../api/promotion/activity.js");
- require("../../api/promotion/article.js");
- require("../../api/promotion/bargain.js");
- require("../../api/promotion/combination.js");
- require("../../api/promotion/rewardActivity.js");
- require("../../api/promotion/seckill.js");
- require("../../api/system/area.js");
- require("../../api/system/voice.js");
- require("../../api/trade/afterSale.js");
- require("../../api/trade/brokerage.js");
- require("../../api/trade/config.js");
- require("../../api/trade/delivery.js");
- require("../../config/zIndex.js");
- const uploadImage = () => "./upload-image.js";
- const uploadFile = () => "./upload-file.js";
- const _sfc_main = {
- name: "sUploader",
- components: {
- uploadImage,
- uploadFile
- },
- options: {
- virtualHost: true
- },
- emits: ["select", "success", "fail", "progress", "delete", "update:modelValue", "update:url"],
- props: {
- modelValue: {
- type: [Array, Object],
- default() {
- return [];
- }
- },
- url: {
- type: [Array, String],
- default() {
- return [];
- }
- },
- disabled: {
- type: Boolean,
- default: false
- },
- disablePreview: {
- type: Boolean,
- default: false
- },
- delIcon: {
- type: Boolean,
- default: true
- },
- // 自动上传
- autoUpload: {
- type: Boolean,
- default: true
- },
- // 最大选择个数 ,h5只能限制单选或是多选
- limit: {
- type: [Number, String],
- default: 9
- },
- // 列表样式 grid | list | list-card
- mode: {
- type: String,
- default: "grid"
- },
- // 选择文件类型 image/video/all
- fileMediatype: {
- type: String,
- default: "image"
- },
- // 文件类型筛选
- fileExtname: {
- type: [Array, String],
- default() {
- return [];
- }
- },
- title: {
- type: String,
- default: ""
- },
- listStyles: {
- type: Object,
- default() {
- return {
- // 是否显示边框
- border: true,
- // 是否显示分隔线
- dividline: true,
- // 线条样式
- borderStyle: {}
- };
- }
- },
- imageStyles: {
- type: Object,
- default() {
- return {
- width: "auto",
- height: "auto"
- };
- }
- },
- readonly: {
- type: Boolean,
- default: false
- },
- sizeType: {
- type: Array,
- default() {
- return ["original", "compressed"];
- }
- },
- driver: {
- type: String,
- default: "local"
- // local=本地 | oss | unicloud
- },
- subtitle: {
- type: String,
- default: ""
- }
- },
- data() {
- return {
- files: [],
- localValue: [],
- imgsrc: sheep_index.sheep.$url.static("/static/images/upload-camera.png")
- };
- },
- watch: {
- modelValue: {
- handler(newVal, oldVal) {
- this.setValue(newVal, oldVal);
- },
- immediate: true
- }
- },
- computed: {
- returnType() {
- if (this.limit > 1) {
- return "array";
- }
- return "object";
- },
- filesList() {
- let files = [];
- this.files.forEach((v) => {
- files.push(v);
- });
- return files;
- },
- showType() {
- if (this.fileMediatype === "image") {
- return this.mode;
- }
- return "list";
- },
- limitLength() {
- if (this.returnType === "object") {
- return 1;
- }
- if (!this.limit) {
- return 1;
- }
- if (this.limit >= 9) {
- return 9;
- }
- return this.limit;
- }
- },
- created() {
- if (this.driver === "local") {
- common_vendor.Ws.chooseAndUploadFile = sheep_components_sUploader_chooseAndUploadFile.chooseAndUploadFile;
- }
- this.form = this.getForm("uniForms");
- this.formItem = this.getForm("uniFormsItem");
- if (this.form && this.formItem) {
- if (this.formItem.name) {
- this.rename = this.formItem.name;
- this.form.inputChildrens.push(this);
- }
- }
- },
- methods: {
- /**
- * 公开用户使用,清空文件
- * @param {Object} index
- */
- clearFiles(index) {
- if (index !== 0 && !index) {
- this.files = [];
- this.$nextTick(() => {
- this.setEmit();
- });
- } else {
- this.files.splice(index, 1);
- }
- this.$nextTick(() => {
- this.setEmit();
- });
- },
- /**
- * 公开用户使用,继续上传
- */
- upload() {
- let files = [];
- this.files.forEach((v, index) => {
- if (v.status === "ready" || v.status === "error") {
- files.push(Object.assign({}, v));
- }
- });
- return this.uploadFiles(files);
- },
- async setValue(newVal, oldVal) {
- const newData = async (v) => {
- const reg = /cloud:\/\/([\w.]+\/?)\S*/;
- let url = "";
- if (v.fileID) {
- url = v.fileID;
- } else {
- url = v.url;
- }
- if (reg.test(url)) {
- v.fileID = url;
- v.url = await this.getTempFileURL(url);
- }
- if (v.url)
- v.path = v.url;
- return v;
- };
- if (this.returnType === "object") {
- if (newVal) {
- await newData(newVal);
- } else {
- newVal = {};
- }
- } else {
- if (!newVal)
- newVal = [];
- for (let i = 0; i < newVal.length; i++) {
- let v = newVal[i];
- await newData(v);
- }
- }
- this.localValue = newVal;
- if (this.form && this.formItem && !this.is_reset) {
- this.is_reset = false;
- this.formItem.setValue(this.localValue);
- }
- let filesData = Object.keys(newVal).length > 0 ? newVal : [];
- this.files = [].concat(filesData);
- },
- /**
- * 选择文件
- */
- choose() {
- if (this.disabled)
- return;
- if (this.files.length >= Number(this.limitLength) && this.showType !== "grid" && this.returnType === "array") {
- common_vendor.index.showToast({
- title: `您最多选择 ${this.limitLength} 个文件`,
- icon: "none"
- });
- return;
- }
- this.chooseFiles();
- },
- /**
- * 选择文件并上传
- */
- chooseFiles() {
- const _extname = sheep_components_sUploader_utils.get_extname(this.fileExtname);
- common_vendor.Ws.chooseAndUploadFile({
- type: this.fileMediatype,
- compressed: false,
- sizeType: this.sizeType,
- // TODO 如果为空,video 有问题
- extension: _extname.length > 0 ? _extname : void 0,
- count: this.limitLength - this.files.length,
- //默认9
- onChooseFile: this.chooseFileCallback,
- onUploadProgress: (progressEvent) => {
- this.setProgress(progressEvent, progressEvent.index);
- }
- }).then((result) => {
- this.setSuccessAndError(result.tempFiles);
- }).catch((err) => {
- console.log("选择失败", err);
- });
- },
- /**
- * 选择文件回调
- * @param {Object} res
- */
- async chooseFileCallback(res) {
- const _extname = sheep_components_sUploader_utils.get_extname(this.fileExtname);
- const is_one = Number(this.limitLength) === 1 && this.disablePreview && !this.disabled || this.returnType === "object";
- if (is_one) {
- this.files = [];
- }
- let { filePaths, files } = sheep_components_sUploader_utils.get_files_and_is_max(res, _extname);
- if (!(_extname && _extname.length > 0)) {
- filePaths = res.tempFilePaths;
- files = res.tempFiles;
- }
- let currentData = [];
- for (let i = 0; i < files.length; i++) {
- if (this.limitLength - this.files.length <= 0)
- break;
- files[i].uuid = Date.now();
- let filedata = await sheep_components_sUploader_utils.get_file_data(files[i], this.fileMediatype);
- filedata.progress = 0;
- filedata.status = "ready";
- this.files.push(filedata);
- currentData.push({
- ...filedata,
- file: files[i]
- });
- }
- this.$emit("select", {
- tempFiles: currentData,
- tempFilePaths: filePaths
- });
- res.tempFiles = files;
- if (!this.autoUpload) {
- res.tempFiles = [];
- }
- },
- /**
- * 批传
- * @param {Object} e
- */
- uploadFiles(files) {
- files = [].concat(files);
- return sheep_components_sUploader_chooseAndUploadFile.uploadCloudFiles.call(this, files, 5, (res) => {
- this.setProgress(res, res.index, true);
- }).then((result) => {
- this.setSuccessAndError(result);
- return result;
- }).catch((err) => {
- console.log(err);
- });
- },
- /**
- * 成功或失败
- */
- async setSuccessAndError(res, fn) {
- let successData = [];
- let errorData = [];
- let tempFilePath = [];
- let errorTempFilePath = [];
- for (let i = 0; i < res.length; i++) {
- const item = res[i];
- const index = item.uuid ? this.files.findIndex((p) => p.uuid === item.uuid) : item.index;
- if (index === -1 || !this.files)
- break;
- if (item.errMsg === "request:fail") {
- this.files[index].url = item.path;
- this.files[index].status = "error";
- this.files[index].errMsg = item.errMsg;
- errorData.push(this.files[index]);
- errorTempFilePath.push(this.files[index].url);
- } else {
- this.files[index].errMsg = "";
- this.files[index].fileID = item.url;
- const reg = /cloud:\/\/([\w.]+\/?)\S*/;
- if (reg.test(item.url)) {
- this.files[index].url = await this.getTempFileURL(item.url);
- } else {
- this.files[index].url = item.url;
- }
- this.files[index].status = "success";
- this.files[index].progress += 1;
- successData.push(this.files[index]);
- tempFilePath.push(this.files[index].fileID);
- }
- }
- if (successData.length > 0) {
- this.setEmit();
- this.$emit("success", {
- tempFiles: this.backObject(successData),
- tempFilePaths: tempFilePath
- });
- }
- if (errorData.length > 0) {
- this.$emit("fail", {
- tempFiles: this.backObject(errorData),
- tempFilePaths: errorTempFilePath
- });
- }
- },
- /**
- * 获取进度
- * @param {Object} progressEvent
- * @param {Object} index
- * @param {Object} type
- */
- setProgress(progressEvent, index, type) {
- this.files.length;
- const percentCompleted = Math.round(progressEvent.loaded * 100 / progressEvent.total);
- let idx = index;
- if (!type) {
- idx = this.files.findIndex((p) => p.uuid === progressEvent.tempFile.uuid);
- }
- if (idx === -1 || !this.files[idx])
- return;
- this.files[idx].progress = percentCompleted - 1;
- this.$emit("progress", {
- index: idx,
- progress: parseInt(percentCompleted),
- tempFile: this.files[idx]
- });
- },
- /**
- * 删除文件
- * @param {Object} index
- */
- delFile(index) {
- this.$emit("delete", {
- tempFile: this.files[index],
- tempFilePath: this.files[index].url
- });
- this.files.splice(index, 1);
- this.$nextTick(() => {
- this.setEmit();
- });
- },
- /**
- * 获取文件名和后缀
- * @param {Object} name
- */
- getFileExt(name) {
- const last_len = name.lastIndexOf(".");
- const len = name.length;
- return {
- name: name.substring(0, last_len),
- ext: name.substring(last_len + 1, len)
- };
- },
- /**
- * 处理返回事件
- */
- setEmit() {
- let data = [];
- let updateUrl = [];
- if (this.returnType === "object") {
- data = this.backObject(this.files)[0];
- this.localValue = data ? data : null;
- updateUrl = data ? data.url : "";
- } else {
- data = this.backObject(this.files);
- if (!this.localValue) {
- this.localValue = [];
- }
- this.localValue = [...data];
- if (this.localValue.length > 0) {
- this.localValue.forEach((item) => {
- updateUrl.push(item.url);
- });
- }
- }
- this.$emit("update:modelValue", this.localValue);
- this.$emit("update:url", updateUrl);
- },
- /**
- * 处理返回参数
- * @param {Object} files
- */
- backObject(files) {
- let newFilesData = [];
- files.forEach((v) => {
- newFilesData.push({
- extname: v.extname,
- fileType: v.fileType,
- image: v.image,
- name: v.name,
- path: v.path,
- size: v.size,
- fileID: v.fileID,
- url: v.url
- });
- });
- return newFilesData;
- },
- async getTempFileURL(fileList) {
- fileList = {
- fileList: [].concat(fileList)
- };
- const urls = await common_vendor.Ws.getTempFileURL(fileList);
- return urls.fileList[0].tempFileURL || "";
- },
- /**
- * 获取父元素实例
- */
- getForm(name = "uniForms") {
- let parent = this.$parent;
- let parentName = parent.$options.name;
- while (parentName !== name) {
- parent = parent.$parent;
- if (!parent)
- return false;
- parentName = parent.$options.name;
- }
- return parent;
- }
- }
- };
- if (!Array) {
- const _component_upload_image = common_vendor.resolveComponent("upload-image");
- const _component_upload_file = common_vendor.resolveComponent("upload-file");
- (_component_upload_image + _component_upload_file)();
- }
- function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
- return common_vendor.e({
- a: $props.title
- }, $props.title ? {
- b: common_vendor.t($props.title),
- c: common_vendor.t($options.filesList.length),
- d: common_vendor.t($options.limitLength)
- } : {}, {
- e: $props.subtitle
- }, $props.subtitle ? {
- f: common_vendor.t($props.subtitle)
- } : {}, {
- g: $props.fileMediatype === "image" && $options.showType === "grid"
- }, $props.fileMediatype === "image" && $options.showType === "grid" ? {
- h: $data.imgsrc,
- i: common_vendor.o($options.uploadFiles),
- j: common_vendor.o($options.choose),
- k: common_vendor.o($options.delFile),
- l: common_vendor.p({
- readonly: $props.readonly,
- ["image-styles"]: $props.imageStyles,
- ["files-list"]: $props.url,
- limit: $options.limitLength,
- disablePreview: $props.disablePreview,
- delIcon: $props.delIcon
- })
- } : {}, {
- m: $props.fileMediatype !== "image" || $options.showType !== "grid"
- }, $props.fileMediatype !== "image" || $options.showType !== "grid" ? {
- n: common_vendor.o($options.uploadFiles),
- o: common_vendor.o($options.choose),
- p: common_vendor.o($options.delFile),
- q: common_vendor.p({
- readonly: $props.readonly,
- ["list-styles"]: $props.listStyles,
- ["files-list"]: $options.filesList,
- showType: $options.showType,
- delIcon: $props.delIcon
- })
- } : {});
- }
- const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-82f430bc"], ["__file", "D:/zx/mall-front-app/sheep/components/s-uploader/s-uploader.vue"]]);
- wx.createComponent(Component);
|