zoukankan      html  css  js  c++  java
  • vue elementUI 图片上传

    实现多张图片和单张图片上传和删除功能。

    前端代码如下:

    <style>
        #app {
            background-color: white;
            padding: 15px 15px;
        }
    
        .el-row {
            margin: 60px 20px;
        }
    
        input[type="file"] {
            display: none;
        }
    
        .el-form-item__content {
            display: inline-block;
        }
    </style>
    <div id="app">
        <el-button type="primary" icon="el-icon-arrow-left" v-on:click="ReturnGoodsList()">返回</el-button>
        <el-form ref="form" :model="form" status-icon :rules="rules" label-width="100px;" class="demo-ruleForm">
    
            <el-row>
                <el-col :span="4">
                    <el-form-item label="兑换名称:" prop="Name">
                        <el-input v-model="form.Name"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="4">
                    <el-form-item label="所需积分:" prop="RequireScore">
                        <el-input v-model.number="form.RequireScore"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="4">
                    <el-form-item label="每人限额:" prop="PerPersonCount">
                        <el-input v-model.number="form.PerPersonCount"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="4">
                    <el-form-item label="总共份额:" prop="Stock">
                        <el-input v-model.number="form.Stock"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="4">
                    <el-form-item label="价格:" prop="Price">
                        <el-input v-model="form.Price"></el-input>
                    </el-form-item>
                </el-col>
            </el-row>
            <el-row style="margin-top:20px;">
                <el-col :span="1">
                    <label>商品展示图:</label>
                </el-col>
                <el-col :span="23">
                    <el-upload style="display:inline-block;"
                               action="/api/score-mgr/Score/GoodsUploadImg"
                               list-type="picture-card"
                               :auto-upload="false"
                               :data="getScoreForm()"
                               ref="uploadRef"
                               :limit="4"
                               :multiple="true"
                               :file-list="fileList"
                               :on-remove="removePic"
                               :on-success="onSuccess"
                               :on-error="onError">
                        <i slot="default" class="el-icon-plus"></i>
                        <div slot="file" slot-scope="{file}">
                            <img class="el-upload-list__item-thumbnail"
                                 :src="file.url" alt="">
                            <span class="el-upload-list__item-actions">
                                <span v-if="true"
                                      class="el-upload-list__item-delete"
                                      v-on:click="removePic(file)">
                                    <i class="el-icon-delete"></i>
                                </span>
                            </span>
                        </div>
                    </el-upload>
                </el-col>
            </el-row>
            <el-row>
                <el-col :span="1">
                    <label>商品说明:</label>
                </el-col>
                <el-col :span="23">
                    @*<el-form-item label="商品说明:" prop="desc">
                            <textarea rows="10" v-model="form.Desc" style="100%;"></textarea>
                        </el-form-item>*@
                    <textarea rows="30" style="100%" v-model="form.Desc"></textarea>
                </el-col>
            </el-row>
            <el-row>
                <el-col :span="4">
                    <el-form-item label="兑换截至时间:" prop="">
                        <el-date-picker v-model="form.Deadline" type="datetime" placeholder="选择日期" value-format="yyyy-MM-dd HH:mm:ss">
                        </el-date-picker>
                    </el-form-item>
                </el-col>
            </el-row>
            <el-row style="text-align:center;">
                <el-button type="primary" v-on:click="SaveGoods('form')">保存提交</el-button>
            </el-row>
        </el-form>
    
    </div>
    
    <script src="~/app-js/tools.js"></script>
    <script>
        let isSubmiting = false;
        let goodsId = "@(ViewBag.goodsId??0)";
        let imgUrl = GetIMGUrl();
        let imgLength = 0;
        let checkRequireScore = function (rule, value, callback) {
            if (!value) {
                return callback(new Error('所需积分不能为空'));
            }
            if (!Number.isInteger(value)) {
                callback(new Error('请输入数字值'));
            } else {
                callback();
            }
        };
        let checkPerPersonCount = function (rule, value, callback) {
            if (!value) {
                return callback(new Error('每人限额不能为空'));
            }
            if (!Number.isInteger(value)) {
                callback(new Error('请输入数字值'));
            } else {
                callback();
            }
        };
        let checkStock = function (rule, value, callback) {
            if (!value) {
                return callback(new Error('每人限额不能为空'));
            }
            if (!Number.isInteger(value)) {
                callback(new Error('请输入数字值'));
            } else {
                callback();
            }
        };
        let checkPrice = function (rule, value, callback)  {
            var regPos = /^d+(.d+)?$/; //非负浮点数
            //var regNeg = /^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
            if (!regPos.test(value)) {
                callback(new Error('请输入数字值'));
            } else {
                callback();
            }
        };
        let fileCount = 0;
        let vm = new Vue({
            el: "#app",
            data: {
                form: {
                    Name: '',
                    RequireScore: '',
                    PerPersonCount: '',
                    Stock: '',
                    Desc: '',
                    Price: '',
                    Deadline: '',
                    Imgs: [],
                    removeIdList: [],
                },
                fileList: [],
                uploadFileList: [],
                rules: {
                    Name: [
                        { required: true, message: '请输入物品名称', trigger: 'blur' },
                    ],
                    RequireScore: [
                        { validator: checkRequireScore, trigger: 'blur' }
                    ],
                    PerPersonCount: [
                        { validator: checkPerPersonCount, trigger: 'blur' }
                    ],
                    Stock: [
                        { validator: checkStock, trigger: 'blur' }
                    ],
                    Price: [
                        { validator: checkPrice, trigger: 'blur' }
                    ],
                    desc: [
                        { required: true, message: '请填写商品描述', trigger: 'blur' }
                    ]
                },
            },
            beforeCreate() { },
            created() { },
            beforeMount() { },
            mounted() {
                this.loadGoods();
            },
            components: {
    
            },
            methods: {
                loadGoods() {
                    this.form.removeIdList = [];
                    if (goodsId!="0") {
                        ajax({
                            url: '/api/score-mgr/Score/GetGoods',
                            params: {
                                goodsId: goodsId
                            }
                        }).then((res) => {
                            let data = res.data;
                            if (data.Result) {
                                this.form = data.Content;
                                imgLength = data.Content.GoodsImgs.length;
                                for (var i = 0; i < data.Content.GoodsImgs.length; i++) {
                                    let obj = new Object();
                                    obj.url = imgUrl + data.Content.GoodsImgs[i].ImageUrl;
                                    obj.uid = data.Content.GoodsImgs[i].Id;
                                    obj.name = data.Content.GoodsImgs[i].Id;
                                    this.fileList.push(obj);
                                }
                                this.form.removeIdList = [];
                                fileCount = this.fileList.length;
                            }
                        }).catch((err) => {
                            console.log(err);
                            this.form.removeIdList = [];
                        });
                    }
                },
                handleRemove(file) {
    
                },
                removePic(file) {
                    let files = this.$refs.uploadRef.uploadFiles;
                    let index = files.findIndex(fileItem => {
                        return fileItem.uid === file.uid
                    })
                    this.form.removeIdList.push(files[index].uid);
                    for (var i = 0; i < this.fileList.length; i++) {
                        if (files[index].uid == this.fileList[i].uid) {
                            fileCount = fileCount - 1;
                        }
                    }
                    console.log(this.form.removeIdList);
                    files.splice(index, 1);
                    
                },
                getScoreForm() {
                    return this.form;
                },
                onSuccess(res) {
                    if (res.Result) {
                        this.form.Imgs.push(res.Content);
                    } else {
                        alert("商品信息保存失败,请刷新页面重新上传");
                        return;
                    }
                    console.log(this.fileList.length);
                    //if (this.form.Imgs.length + this.fileList.length == this.$refs.uploadRef.uploadFiles.length + this.form.removeIdList.length)
                    console.log(this.form.removeIdList.length);
                    console.log(fileCount);
                    if (this.form.Imgs.length + fileCount == this.$refs.uploadRef.uploadFiles.length) {
                        ajax({
                            url: '/api/score-mgr/Score/SaveGoods',
                            method: "post",
                            data: this.form
                        }).then((res) => {
                            let data = res.data;
                            if (data.Result) {
                                alert("物品配置保存成功");
                                location.href = "/Score/ScoreExchange";
                            }
    
                        }).catch((err) => {
                            console.log(err);
                            alert("保存错误");
                            return;
                        });
                    }
                },
                onError(res) {
                    isSubmiting = false;
                    alert("设置失败");
                    return;
                },
                SaveGoods(formName) {
                    this.$refs[formName].validate((valid) => {
                        if (valid) {
                            if (this.$refs.uploadRef.uploadFiles.length > fileCount) {
                                this.form.Imgs = [];
                                console.log(this.$refs.uploadRef.uploadFiles.length);
                                this.$refs.uploadRef.submit();
                                return;
                            }
                            ajax({
                                url: '/api/score-mgr/Score/SaveGoods',
                                method: "post",
                                data: this.form
                            }).then((res) => {
                                let data = res.data;
                                if (data.Result) {
                                    alert("物品配置保存成功");
                                    location.href = "/Score/ScoreExchange";
                                }
                            }).catch((err) => {
                                console.log(err);
                                alert("保存错误");
                                return;
                            });
                        }
                        else {
                            alert("请填写正确的内容,然后保存提交!");
                            return false;
                        }
                    });
                },
                ReturnGoodsList() {
                    location.href = "/Score/ScoreExchange";
                }
            }
        });
    </script>

    因为是后端是mvc模式,前端使用vue模式调用接口模式是使用ajax调用,所以后端控制器中仅是页面,没有接口逻辑,具体的接口代码是使用api格式。

    后端上传代码如下:

    //mvc controller 代码:

    [MvcPermissionAuthorize("6103")]//权限验证
    public async Task<IActionResult> AddExchangeSetting()
    {
    string goodsId = Request.Query["goodsId"];
    ViewBag.goodsId = goodsId;
    return View();
    }



    //接口逻辑代码:

    ///
    <summary> /// 上传图片 /// </summary> /// <returns></returns> [HttpPost] [MvcPermissionAuthorize("6103")] public BaseResponseResult<string> GoodsUploadImg() { BaseResponseResult<string> res = new BaseResponseResult<string>(); var file = Request.Form.Files.FirstOrDefault(); if (file == null) throw new DFBusinessException("文件为空"); var ss = Directory.GetCurrentDirectory(); //var ss1 = AppContext.BaseDirectory; //图片上传地址 string imgAddress = ConfigLoader.ScoreCommonSettings.UploadImageAddress; string macPath = ss + "/wwwroot" + imgAddress; if (!System.IO.Directory.Exists(macPath)) { Directory.CreateDirectory(macPath); // 不存在就创建目录 } System.Drawing.Image img = System.Drawing.Bitmap.FromStream(file.OpenReadStream()); string fileName = Snowflake_19_Helper.NewId().ToString() + ".jpg"; string imgPath = macPath + "/" + fileName; var mstream = ImageHelper.GetThumbPicStream(file.OpenReadStream(),800,800, img.RawFormat, ThumbPicModeEnum.hw); Bitmap bt = new Bitmap(mstream); bt.Save(imgPath); bt.Dispose(); img.Dispose(); return res.GetSuccess(imgAddress+"/" + fileName); } /// <summary> /// 新添兑换物品 /// </summary> /// <returns></returns> [HttpPost] [MvcPermissionAuthorize("6103")] public async Task<BaseResponseResult<int>> SaveGoods(SaveGoodsModel goods) { List<GoodsImages> goodsImgs = new List<GoodsImages>(); if (goods.Imgs != null) for (int i = 0; i < goods.Imgs.Count; i++) { GoodsImages imgs = new GoodsImages(); imgs.Id = Snowflake_19_Helper.NewId(); imgs.GoodsId = goods.Id; imgs.ImageUrl = goods.Imgs[i]; imgs.CreateTime = DateTime.Now; goodsImgs.Add(imgs); } goods.CreateTime = DateTime.Now; var lst = await _scoreService.SaveGoods(goods, goodsImgs, goods.removeIdList); return lst; }
  • 相关阅读:
    Android 显示或隐藏标题栏进度条TitleProgressBar
    Android 利用Sharp样式设置文本框EditText圆角形状
    Android 中带有进度条效果的按钮(Button)
    Android 手势滑动,多点触摸放大缩小图片
    Android (Notification)消息推送机制
    Android AutoCompleteTextView控件实现类似百度搜索提示,限制输入数字长度
    Android 横向列表GridView 实现横向滚动
    Android 利用 AsyncTask 异步读取网络图片
    Android 各种功能代码收集
    Android 之 AlarmManager(定时器) 的介绍和使用
  • 原文地址:https://www.cnblogs.com/wwr01/p/15090959.html
Copyright © 2011-2022 走看看