Compare commits

...

3 Commits

@ -1,121 +1,194 @@
<template>  <template>
<div> <!-- 创建一个 div 元素作为整个组件内容的包裹容器这是 HTML 中常用的用于组织和划分页面结构的方式 -->
<el-upload <div>
:action="useOss?ossUploadUrl:minioUploadUrl" <!-- el-upload 组件用于实现文件上传功能它是基于 Element UI 库提供的组件方便在 Vue 项目中快速集成文件上传交互功能 -->
:data="useOss?dataObj:null" <el-upload
list-type="picture-card" <!-- 通过三元表达式根据 useOss 的值来动态决定上传文件的 action 属性值即上传文件的请求地址 -->
:file-list="fileList" <!-- 如果 useOss true就使用 ossUploadUrl 作为上传地址这通常意味着要将文件上传到阿里云 OSSObject Storage Service对象存储服务服务器上 -->
:before-upload="beforeUpload" <!-- 如果 useOss false则使用 minioUploadUrl 作为上传地址MinIO 也是一种常用的对象存储服务这里可以根据实际需求切换使用不同的存储服务来上传文件 -->
:on-remove="handleRemove" :action="useOss?ossUploadUrl:minioUploadUrl"
:on-success="handleUploadSuccess" <!-- 同样基于 useOss 的值来决定是否向上传请求中传递额外的数据以对象形式 -->
:on-preview="handlePreview" <!-- useOss true dataObj 作为额外的数据传递给上传请求这些数据一般包含了与文件上传到 OSS 相关的配置信息例如上传策略签名等用于服务器验证上传的合法性 -->
:limit="maxCount" <!-- useOss false 不传递额外的数据即设置为 null -->
:on-exceed="handleExceed" :data="useOss?dataObj:null"
> <!-- 设置文件列表在页面上的展示类型为 "picture-card"这种类型的展示效果通常是以卡片形式呈现已上传的文件在这里主要是图片文件 -->
<i class="el-icon-plus"></i> <!-- 每个文件会以一个独立的卡片样式展示方便用户直观地查看已上传的文件并且可以进行相应的操作如删除预览等 -->
</el-upload> list-type="picture-card"
<el-dialog :visible.sync="dialogVisible"> <!-- 通过绑定计算属性 fileList将已上传文件的相关信息以特定格式传递给 el-upload 组件以便组件能够正确展示已上传的文件列表 -->
<img width="100%" :src="dialogImageUrl" alt=""> <!-- 计算属性 fileList 会根据组件接收到的相关数据进行处理转化为 el-upload 组件可识别的格式后面会在计算属性部分详细说明 -->
</el-dialog> :file-list="fileList"
</div> <!-- 绑定一个名为 before-upload 的回调函数该函数会在每个文件上传之前被触发 -->
<!-- 可以在这个函数中进行一些前置的验证准备工作例如当使用阿里云 OSS 上传时需要在这里获取并设置相关的上传策略等配置信息决定文件是否可以进行上传 -->
:before-upload="beforeUpload"
<!-- 绑定一个名为 on-remove 的回调函数当用户在已展示的文件列表中删除某个文件时这个函数会被触发 -->
<!-- 用于处理文件删除后的相关逻辑比如通知父组件文件列表发生了变化让父组件可以相应地更新页面上显示的文件信息等 -->
:on-remove="handleRemove"
<!-- 绑定一个名为 on-success 的回调函数在文件上传成功后该函数会被触发 -->
<!-- 可以在这个函数里进行后续的操作例如更新文件列表数据通知父组件上传成功的消息以及根据上传结果进行一些页面展示相关的调整等 -->
:on-success="handleUploadSuccess"
<!-- 绑定一个名为 on-preview 的回调函数当用户点击已上传的文件进行预览操作时这个函数会被触发 -->
<!-- 主要用于实现文件的预览功能比如打开一个对话框展示图片的大图等操作 -->
:on-preview="handlePreview"
<!-- 通过绑定 maxCount 属性来设置允许上传的文件最大数量这个属性的值来源于组件通过 props 接收的父组件传递过来的 maxCount -->
<!-- 限制用户最多只能上传指定数量的文件若用户尝试上传超过此数量的文件会触发相应的超出限制处理逻辑 -->
:limit="maxCount"
<!-- 绑定一个名为 on-exceed 的回调函数当用户上传的文件数量超过了通过 :limit 设置的最大数量时该函数会被触发 -->
<!-- 用于给出相应的提示信息告知用户上传文件数量超出了限制让用户知晓当前的操作不符合规定 -->
:on-exceed="handleExceed"
>
<!-- el-upload 组件内部添加一个图标元素使用 el-icon-plus 这个类来展示一个加号图标 -->
<!-- 通常这个加号图标在界面上用于提示用户可以点击此处进行文件上传操作是一种常见的交互设计方式 -->
<i class="el-icon-plus"></i>
</el-upload>
<!-- el-dialog 组件用于创建一个对话框用于展示图片的预览功能它也是 Element UI 库中的组件方便实现弹出式的展示界面 -->
<el-dialog :visible.sync="dialogVisible">
<!-- 在对话框内部放置一个 img 元素用于展示要预览的图片 -->
<!-- 通过绑定 src 属性为 dialogImageUrl根据这个属性的值来确定要展示的图片的路径从而正确显示相应的图片内容 -->
<!-- 设置图片的宽度为 100%让图片能够自适应对话框的宽度完整地展示出来 -->
<img width="100%" :src="dialogImageUrl" alt="">
</el-dialog>
</div>
</template> </template>
<script> <script>
import {policy} from '@/api/oss' // '@/api/oss' policy OSS Policy -->
// 访 OSS
import {policy} from '@/api/oss';
export default { // Vue Vue 使使
name: 'multiUpload', export default {
props: { // Vue 'multiUpload'便
// name: 'multiUpload',
value: Array, // props -->
// props: {
maxCount:{ // value -->
type:Number, // 便 -->
default:5 value: Array,
} // maxCount -->
}, // Number 5 5 -->
data() { maxCount: {
return { type: Number,
dataObj: { default: 5
policy: '', }
signature: '',
key: '',
ossaccessKeyId: '',
dir: '',
host: ''
}, },
dialogVisible: false, data() {
dialogImageUrl:null, return {
useOss:false, //使oss->true;使MinIO->false // dataObj 使 OSS -->
ossUploadUrl:'http://macro-oss.oss-cn-shenzhen.aliyuncs.com', // policy signature ossaccessKeyId 访 ID OSS -->
minioUploadUrl:'http://localhost:8080/minio/upload', dataObj: {
}; policy: '',
}, signature: '',
computed: { key: '',
fileList() { ossaccessKeyId: '',
let fileList=[]; dir: '',
for(let i=0;i<this.value.length;i++){ host: ''
fileList.push({url:this.value[i]}); },
} // dialogVisible false -->
return fileList; // true使 -->
} dialogVisible: false,
}, // dialogImageUrl null -->
methods: { // 便 img -->
emitInput(fileList) { dialogImageUrl: null,
let value=[]; // useOss 使 OSS true MinIO false -->
for(let i=0;i<fileList.length;i++){ // -->
value.push(fileList[i].url); useOss: false,
} // ossUploadUrl OSS -->
this.$emit('input', value) // OSS useOss true 使 OSS -->
}, ossUploadUrl: 'http://macro-oss.oss-cn-shenzhen.aliyuncs.com',
handleRemove(file, fileList) { // minioUploadUrl MinIO -->
this.emitInput(fileList); // useOss false 使 MinIO MinIO -->
}, minioUploadUrl: 'http://localhost:8080/minio/upload',
handlePreview(file) { };
this.dialogVisible = true; },
this.dialogImageUrl=file.url; computed: {
}, // fileList value -->
beforeUpload(file) { // value url fileList fileList -->
let _self = this; // fileList el-upload -->
if(!this.useOss){ fileList() {
//使oss let fileList = [];
return true; for (let i = 0; i < this.value.length; i++) {
} fileList.push({url: this.value[i]});
return new Promise((resolve, reject) => { }
policy().then(response => { return fileList;
_self.dataObj.policy = response.data.policy; }
_self.dataObj.signature = response.data.signature; },
_self.dataObj.ossaccessKeyId = response.data.accessKeyId; methods: {
_self.dataObj.key = response.data.dir + '/${filename}'; // emitInput 'input' -->
_self.dataObj.dir = response.data.dir; // 使 -->
_self.dataObj.host = response.data.host; emitInput(fileList) {
resolve(true) let value = [];
}).catch(err => { for (let i = 0; i < fileList.length; i++) {
console.log(err) value.push(fileList[i].url);
reject(false) }
}) this.$emit('input', value)
}) },
}, // handleRemove -->
handleUploadSuccess(res, file) { // el-upload emitInput fileList -->
let url = this.dataObj.host + '/' + this.dataObj.dir + '/' + file.name; // -->
if(!this.useOss){ handleRemove(file, fileList) {
//使oss this.emitInput(fileList);
url = res.data.url; },
// handlePreview -->
// dialogVisible true使 -->
// file.url dialogImageUrl 便 img -->
handlePreview(file) {
this.dialogVisible = true;
this.dialogImageUrl = file.url;
},
// beforeUpload -->
// 使 OSS useOss false true -->
// 使 OSSuseOss true policy -->
// dataObj resolve(true) -->
// catch reject(false) -->
beforeUpload(file) {
let _self = this;
if (!this.useOss) {
// 使 oss
return true;
}
return new Promise((resolve, reject) => {
policy().then(response => {
_self.dataObj.policy = response.data.policy;
_self.dataObj.signature = response.data.signature;
_self.dataObj.ossaccessKeyId = response.data.accessKeyId;
_self.dataObj.key = response.data.dir + '/${filename}';
_self.dataObj.dir = response.data.dir;
_self.dataObj.host = response.data.host;
resolve(true)
}).catch(err => {
console.log(err)
reject(false)
})
})
},
// handleUploadSuccess -->
// 使 OSS useOss -->
// 使 OSS dataObj.hostdataObj.dirfile.name访 -->
// 使 OSS使res.data.url -->
// fileList -->
// emitInput 便 -->
handleUploadSuccess(res, file) {
let url = this.dataObj.host + '/' + this.dataObj.dir + '/' + file.name;
if (!this.useOss) {
// 使 oss
url = res.data.url;
}
this.fileList.push({name: file.name, url: url});
this.emitInput(this.fileList);
},
// handleExceed -->
// maxCount -->
// $message 使 this.maxCount -->
// 1000 1 -->
handleExceed(files, fileList) {
this.$message({
message: '最多只能上传' + this.maxCount + '张图片',
type: 'warning',
duration: 1000
});
},
} }
this.fileList.push({name: file.name,url:url});
this.emitInput(this.fileList);
},
handleExceed(files, fileList) {
this.$message({
message: '最多只能上传'+this.maxCount+'张图片',
type: 'warning',
duration:1000
});
},
} }
}
</script> </script>
<style> <style>
</style> </style>

@ -1,59 +1,69 @@
<template>  <template>
<el-dialog title="订单跟踪" <!-- 使用 el-dialog 组件创建一个对话框用于展示订单跟踪相关信息设置对话框的标题为 "订单跟踪"通过 :visible.sync 双向绑定对话框的可见性与组件的 visible 属性关联后面会详细介绍绑定 :before-close 事件处理函数用于在对话框关闭前执行一些操作设置对话框宽度为 40% -->
:visible.sync="visible" <el-dialog title="订单跟踪"
:before-close="handleClose" :visible.sync="visible"
width="40%"> :before-close="handleClose"
<el-steps direction="vertical" width="40%">
:active="6" <!-- el-steps 组件用于创建一个步骤条设置方向为垂直direction="vertical"指定当前激活的步骤索引为 6:active="6"这里可能需要根据实际业务逻辑根据订单物流状态动态设置该值设置已完成步骤的状态样式为 "success"通常表示成功完成的视觉效果比如显示为绿色等设置每个步骤之间的间隔为 50pxspace="50px" -->
finish-status="success" <el-steps direction="vertical"
space="50px"> :active="6"
<el-step v-for="item in logisticsList" finish-status="success"
:key="item.name" space="50px">
:title="item.name" <!-- 通过 v-for 指令循环遍历 logisticsList 数据数组来动态生成每个步骤el-step每个步骤绑定一个唯一的 key使用 :key="item.name" Vue 中循环渲染列表时key 是必要的有助于 Vue 更高效地更新虚拟 DOM设置步骤的标题为 item.name从数据中获取每个步骤对应的名称设置步骤的描述信息为 item.time从数据中获取对应时间信息 -->
:description="item.time"></el-step> <el-step v-for="item in logisticsList"
</el-steps> :key="item.name"
</el-dialog> :title="item.name"
:description="item.time"></el-step>
</el-steps>
</el-dialog>
</template> </template>
<script> <script>
const defaultLogisticsList=[ // defaultLogisticsListname time
{name: '订单已提交,等待付款',time:'2017-04-01 12:00:00 '}, const defaultLogisticsList = [
{name: '订单付款成功',time:'2017-04-01 12:00:00 '}, {name: '订单已提交,等待付款', time: '2017-04-01 12:00:00 '},
{name: '在北京市进行下级地点扫描,等待付款',time:'2017-04-01 12:00:00 '}, {name: '订单付款成功', time: '2017-04-01 12:00:00 '},
{name: '在分拨中心广东深圳公司进行卸车扫描,等待付款',time:'2017-04-01 12:00:00 '}, {name: '在北京市进行下级地点扫描,等待付款', time: '2017-04-01 12:00:00 '},
{name: '在广东深圳公司进行发出扫描',time:'2017-04-01 12:00:00 '}, {name: '在分拨中心广东深圳公司进行卸车扫描,等待付款', time: '2017-04-01 12:00:00 '},
{name: '到达目的地网点广东深圳公司,快件将很快进行派送',time:'2017-04-01 12:00:00 '}, {name: '在广东深圳公司进行发出扫描', time: '2017-04-01 12:00:00 '},
{name: '订单已签收,期待再次为您服务',time:'2017-04-01 12:00:00 '} {name: '到达目的地网点广东深圳公司,快件将很快进行派送', time: '2017-04-01 12:00:00 '},
]; {name: '订单已签收,期待再次为您服务', time: '2017-04-01 12:00:00 '}
export default { ];
name:'logisticsDialog',
props: { // Vue
value: Boolean export default {
}, // Vue 'logisticsDialog'
computed:{ name: 'logisticsDialog',
visible: { // props value Vue
get() { props: {
return this.value; value: Boolean
}, },
set(visible){ computed: {
this.value=visible; // visible get set props value Vue props 便
} visible: {
} get() {
}, return this.value;
data() { },
return { set(visible) {
logisticsList:Object.assign({},defaultLogisticsList) this.value = visible;
} }
}, }
methods:{ },
emitInput(val) { data() {
this.$emit('input', val) return {
}, // defaultLogisticsList Object.assign logisticsList
handleClose(){ logisticsList: Object.assign({}, defaultLogisticsList)
this.emitInput(false); }
},
methods: {
// emitInput 'input' val Vue $emit
emitInput(val) {
this.$emit('input', val)
},
// handleClose el-dialog :before-close emitInput false
handleClose() {
this.emitInput(false);
}
}
} }
} </script>
}
</script>
<style></style> <style></style>

Loading…
Cancel
Save