其他更多具体完整项目源码可以私聊我,需要付一点点费用哟~
效果展示
主要部分的代码讲解
上传图片
首先是先通过el标签中的el-upload标签进行图片的上传,然后发送了一条/common/upload请求到服务端进行图片的上传。而on-success进行监听,上传成功后调用函数,将图片的url地址传到form表单中进行回显
上传成功后调用的函数,将返回的数据传到ruleForm中的image
对照片格式进行检验
上传评论
此处使用的还是el的标签el-input,通过v-model与form表单进行绑定,将数据保存在表单中
当操作完成的时候点击保存按钮触发submitForm函数
这个函数的操作是将ruleForm表单的数据保存到params中,然后将表单参数封装发送请求
发送post请求
代码展示
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>评论</title> <!-- 引入样式 --> <link rel="stylesheet" href="../../backend/plugins/element-ui/index.css"/> <link rel="stylesheet" href="../../backend/styles/common.css"/> <link rel="stylesheet" href="../../backend/styles/page.css"/> <!-- <!–引入vant样式–>--> <!-- <link rel="stylesheet" href="../styles/vant.min.css"/>--> <!-- <!– 引入样式 –>--> <!-- <link rel="stylesheet" href="../styles/index.css"/>--> </head> <body> <div class="addBrand-container" id="comment-app"> <div class="container"> <el-form ref="ruleForm" :model="ruleForm" :rules="rules" :inline="true" label-width="180px" class="demo-ruleForm" > <div> <el-form-item label="菜品图片:" prop="region" class="uploadImg" > <!--action="/common/upload"--> <!--on-success:照片上传成功后回显照片的地址到form中 --> <!--on-change:当照片上传时做照片的格式校验--> <el-upload class="avatar-uploader" action="/common/upload" :show-file-list="false" :on-success="handleAvatarSuccess" :on-change="onChange" ref="upload" > <!-- 如果已经上传了照片就通过照片地址把照片显示出来--> <img v-if="imageUrl" :src="imageUrl" class="avatar" ></img> <i v-else class="el-icon-plus avatar-uploader-icon" ></i> </el-upload> </el-form-item> </div> <div class="address"> <el-form-item label="菜品描述:" prop="region" > <el-input v-model="ruleForm.description" type="textarea" :rows="3" placeholder="菜品描述,最长200字" maxlength="200" /> </el-form-item> </div> <div class="subBox address"> <el-form-item> <el-button @click="goBack()"> 取消 </el-button> <el-button type="primary" @click="submitForm('ruleForm')" > 保存 </el-button> </el-form-item> </div> </el-form> </div> </div> <!-- 开发环境版本,包含了有帮助的命令行警告 --> <script src="../../backend/plugins/vue/vue.js"></script> <!-- 引入组件库 --> <script src="../../backend/plugins/element-ui/index.js"></script> <!-- 引入axios --> <script src="../../backend/plugins/axios/axios.min.js"></script> <script src="../../backend/js/request.js"></script> <script src="../../backend/js/validate.js"></script> <script src="../../backend/js/index.js"></script> <script src="../../backend/api/food.js"></script> <script src="../api/comment.js"></script> <script> new Vue({ el: '#comment-app', data() { return { id: '', restKey: 0, textarea: '', value: '', imageUrl: '', actionType: '', vueRest: '1', index: 0, inputStyle: {'flex': 1}, ruleForm: { 'name': '', 'id': '', 'image': '', 'orderId': '', 'description': '', }, mak: false } }, computed: { rules() { return { 'name': [ {'required': true, 'message': '请填写菜品名称', 'trigger': 'blur'} ], 'categoryId': [ {'required': true, 'message': '请选择菜品分类', 'trigger': 'change'} ], 'price': [ { 'required': true, // 'message': '请填写菜品价格', validator: (rules, value, callback) => { if (!value) { callback(new Error('请填写菜品价格')) } else { const reg = /^\d+(\.\d{0,2})?$/ if (reg.test(value)) { if (value < 10000) { callback() } else { callback(new Error('菜品价格小于10000')) } } else { callback(new Error('菜品价格格式只能为数字,且最多保留两位小数')) } } }, 'trigger': 'blur' } ], } } }, created() { this.init() }, mounted() { }, methods: { init(){ this.ruleForm.orderId = localStorage.getItem("orderId") }, outSelect(st, index) { const _this = this setTimeout(() => { const obj = JSON.parse(JSON.stringify(_this.dishFlavors[index])) obj.showOption = st _this.dishFlavors.splice(index, 1, obj) }, 200) }, inputHandle(val, index) { // this.selectFlavor(false,index) }, checkOption(val, ind, index) { this.selectHandle(val.name, index, ind) this.dishFlavors[index].name = val.name }, selectHandle(val, key, ind) { const arrDate = [...this.dishFlavors] arrDate[key] = JSON.parse(JSON.stringify(this.dishFlavorsData[ind])) this.dishFlavors = arrDate }, submitForm(formName, st) { this.$refs[formName].validate((valid) => { if (valid) { let params = {...this.ruleForm} delete params.id addComment(params).then(res => { if (res.code === 1) { this.$message.success('评论添加成功!') if (!st) { this.goBack() } else { this.imageUrl = '' this.ruleForm = { 'name': '', 'id': '', 'orderId': '', 'image': '', 'description': '', } } } else { this.$message.error(res.msg || '操作失败') } }).catch(err => { this.$message.error('请求出错了:' + err) }) } else { return false } }) }, handleAvatarSuccess(response, file, fileList) { // 拼接down接口预览 if (response.code === 0 && response.msg === '未登录') { window.top.location.href = '../../front/page/login.html' } else { this.imageUrl = `/common/download?name=${response.data}` this.ruleForm.image = response.data } }, onChange(file) { if (file) { const suffix = file.name.split('.')[1] const size = file.size / 1024 / 1024 < 2 if (['png', 'jpeg', 'jpg'].indexOf(suffix) < 0) { this.$message.error('上传图片只支持 png、jpeg、jpg 格式!') this.$refs.upload.clearFiles() return false } if (!size) { this.$message.error('上传文件大小不能超过 2MB!') return false } return file } }, goBack() { window.location.href = '../index.html' } } }) </script> </body> </html>
css
.dashboard-container { padding: 20px; } .dashboard-container .container { background: #fff; position: relative; z-index: 1; padding: 30px 28px; border-radius: 4px; } .dashboard-container .container .tableBar { display: flex; margin-bottom: 20px; justify-content: space-between; } .dashboard-container .container .tableBox { width: 100%; border: solid 2px #f3f4f7; border-radius: 2px; } .dashboard-container .container .tableBox .el-image img { width: 40px; border-radius: 5px; } .dashboard-container .container .pageList { text-align: center; margin-top: 30px; } .dashboard-container .container .tableLab .span-btn { cursor: pointer; display: inline-block; font-size: 14px; padding: 0 20px; color: #818693; border-right: solid 1px #d8dde3; } .dashboard-container .container .tableLab .el-button { margin-left: 10px; } .el-table-column--selection .cell { padding-left: 10px; } /* 添加 */ .addBrand-container .avatar-uploader .el-upload { border: 1px dashed #d9d9d9; border-radius: 6px; cursor: pointer; position: relative; overflow: hidden; } .addBrand-container .avatar-uploader .el-upload:hover { border-color: #409eff; } .addBrand-container .avatar-uploader-icon { font-size: 28px; color: #8c939d; width: 200px; height: 160px; line-height: 160px; text-align: center; } .addBrand-container .avatar { width: 160px; height: 160px; display: block; } .addBrand-container .el-form--inline .el-form-item__content { width: 293px; } .addBrand-container .el-input { width: 293px; } .addBrand-container { margin: 30px; } .addBrand-container .container { position: relative; z-index: 1; background: #fff; padding: 30px; border-radius: 4px; min-height: 500px; } .addBrand-container .container .subBox { padding-top: 30px; text-align: center; border-top: solid 1px #f3f4f7; } .flavorBox { width: 777px; } .flavorBox .addBut { background: #ffc200; display: inline-block; padding: 0px 20px; border-radius: 3px; line-height: 40px; cursor: pointer; border-radius: 4px; color: #333333; font-weight: 500; } .flavorBox .flavor { border: solid 1px #dfe2e8; border-radius: 3px; padding: 15px; background: #fafafb; } .flavorBox .flavor .title { color: #606168; } .flavorBox .flavor .cont .items { display: flex; margin: 10px 0; } .flavorBox .flavor .cont .items .itTit { width: 150px; margin-right: 15px; } .flavorBox .flavor .cont .items .itTit input { width: 100%; line-height: 40px; border-radius: 3px; padding: 0 10px; } .flavorBox .flavor .cont .items .labItems { flex: 1; display: flex; flex-wrap: wrap; border-radius: 3px; min-height: 39px; border: solid 1px #d8dde3; background: #fff; padding: 0 5px; } .flavorBox .flavor .cont .items .labItems span { display: inline-block; color: #f19c59; margin: 5px; line-height: 26px; height: 26px; padding: 0 10px; background: #fdf4eb; border-radius: 3px; border: solid 1px #fae2cd; } .flavorBox .flavor .cont .items .labItems span i { cursor: pointer; font-style: normal; } .flavorBox .flavor .cont .items .labItems .inputBox { display: inline-block; width: 100%; height: 36px; line-height: 36px; overflow: hidden; } .flavorBox .flavor .cont .items .delFlavor { display: inline-block; padding: 0 10px; color: #f19c59; cursor: pointer; } .addBrand-container .address .el-form-item__content { width: 777px !important; } .el-button--text { font-weight: 400 !important; font-size: 13px !important; } .el-table td { font-size: 13px !important; } .el-table .cell, .el-table th div, .el-table--border td:first-child .cell, .el-table--border th:first-child .cell { padding-left: 12px; }