controllerapp/controller/admin/goods.jsedit async edit() { //获取修改数据的id var id=this.ctx.request.query.id; //获取所有的颜色值 var colorResult=await this.ctx.model.GoodsColor.find({}); //获取所有的商品类型 var goodsType=await this.ctx.model.GoodsType.find({}); //获取商品分类 var goodsCate=await this.ctx.model.GoodsCate.aggregate([ { $lookup:{ from:‘goods_cate’, localField:’_id’, foreignField:‘pid’, as:‘items’ } }, { $match:{ “pid”:‘0’ } } ]) //获取修改的商品 var goodsResult=await this.ctx.model.Goods.find({’_id’:id}); //获取当前商品的颜色 // 5bbb68dcfe498e2346af9e4a,5bbb68effe498e2346af9e4b,5bc067d92e5f889dc864aa96 var colorArrTemp=goodsResult[0].goods_color.split(’,’); // console.log(colorArrTemp); var goodsColorArr=[]; colorArrTemp.forEach((value)=>{ goodsColorArr.push({"_id":value}) }) var goodsColorReulst=await this.ctx.model.GoodsColor.find({ $or:goodsColorArr }) // console.log(colorReulst); //获取规格信息 var goodsAttsResult=await this.ctx.model.GoodsAttr.find({“goods_id”:goodsResult[0]._id}); var goodsAttsStr=’’; goodsAttsResult.forEach(async (val)=>{ if(val.attribute_type==1){ goodsAttsStr+=&lt;li&gt;&lt;span&gt;${val.attribute_title}:  &lt;/span&gt;&lt;input type="hidden" name="attr_id_list" value="${val.attribute_id}" /&gt; &lt;input type="text" name="attr_value_list" value="${val.attribute_value}" /&gt;&lt;/li&gt;; }else if(val.attribute_type==2){ goodsAttsStr+=&lt;li&gt;&lt;span&gt;${val.attribute_title}:  &lt;/span&gt;&lt;input type="hidden" name="attr_id_list" value="${val.attribute_id}" /&gt; &lt;textarea cols="50" rows="3" name="attr_value_list"&gt;${val.attribute_value}&lt;/textarea&gt;&lt;/li&gt;; }else{ //获取 attr_value 获取可选值列表 var oneGoodsTypeAttributeResult=await this.ctx.model.GoodsTypeAttribute.find({ _id:val.attribute_id }) var arr=oneGoodsTypeAttributeResult[0].attr_value.split(’\n’); goodsAttsStr+=&lt;li&gt;&lt;span&gt;${val.attribute_title}:  &lt;/span&gt;&lt;input type="hidden" name="attr_id_list" value="${val.attribute_id}" /&gt;; goodsAttsStr+=&lt;select name="attr_value_list"&gt;; for(var j=0;j<arr.length;j++){ if(arr[j]==val.attribute_value){ goodsAttsStr+=&lt;option value="${arr[j]}" selected &gt;${arr[j]}&lt;/option&gt;; }else{ goodsAttsStr+=&lt;option value="${arr[j]}" &gt;${arr[j]}&lt;/option&gt;; } } goodsAttsStr+=&lt;/select&gt;; goodsAttsStr+=&lt;/li&gt;; } }) //商品的图库信息 var goodsImageResult=await this.ctx.model.GoodsImage.find({“goods_id”:goodsResult[0]._id}); console.log(goodsImageResult); await this.ctx.render(‘admin/goods/edit’,{ colorResult:colorResult, goodsType:goodsType, goodsCate:goodsCate, goods:goodsResult[0], goodsAtts:goodsAttsStr, goodsImage:goodsImageResult, goodsColor:goodsColorReulst }); } doEdit async doEdit() { let parts = this.ctx.multipart({ autoFields: true }); let files = {}; let stream; while ((stream = await parts()) != null) { if (!stream.filename) { break; } let fieldname = stream.fieldname; //file表单的名字 //上传图片的目录 let dir=await this.service.tools.getUploadFile(stream.filename); let target = dir.uploadDir; let writeStream = fs.createWriteStream(target); await pump(stream, writeStream); files=Object.assign(files,{ [fieldname]:dir.saveDir }) } var formFields=Object.assign(files,parts.field); //修改商品的id var goods_id=parts.field.id; //修改商品信息 await this.ctx.model.Goods.updateOne({"_id":goods_id},formFields); //修改图库信息 (增加) var goods_image_list=formFields.goods_image_list; if(goods_id && goods_image_list){ if(typeof(goods_image_list)==‘string’){ goods_image_list=new Array(goods_image_list); } for(var i=0;i<goods_image_list.length;i++){ let goodsImageRes =new this.ctx.model.GoodsImage({ goods_id:goods_id, img_url:goods_image_list[i] }); await goodsImageRes.save(); } } //修改商品类型数据 1、删除以前的类型数据 2、重新增加新的商品类型数据 //1、删除以前的类型数据 await this.ctx.model.GoodsAttr.deleteOne({“goods_id”:goods_id}); //2、重新增加新的商品类型数据 var attr_value_list=formFields.attr_value_list; var attr_id_list=formFields.attr_id_list; if(goods_id && attr_id_list && attr_value_list){ //解决只有一个属性的时候存在的bug if(typeof(attr_id_list)==‘string’){ attr_id_list=new Array(attr_id_list); attr_value_list=new Array(attr_value_list); } for(var i=0;i<attr_value_list.length;i++){ //查询goods_type_attribute if(attr_value_list[i]){ var goodsTypeAttributeResutl=await this.ctx.model.GoodsTypeAttribute.find({"_id":attr_id_list[i]}) let goodsAttrRes =new this.ctx.model.GoodsAttr({ goods_id:goods_id, cate_id:formFields.cate_id, attribute_id:attr_id_list[i], attribute_type:goodsTypeAttributeResutl[0].attr_type, attribute_title:goodsTypeAttributeResutl[0].title, attribute_value:attr_value_list[i] }); await goodsAttrRes.save(); } } } await this.success(’/admin/goods’,‘修改商品数据成功’); } viewapp/view/admin/goods/edit.html<%- include ../public/page_header.html %> <!– 富文本编辑器 –> <link href="/public/admin/wysiwyg-editor/css/font-awesome.min.css" rel=“stylesheet” type=“text/css” /> <!– Include Editor style. –> <link href="/public/admin/wysiwyg-editor/css/froala_editor.pkgd.min.css" rel=“stylesheet” type=“text/css” /> <link href="/public/admin/wysiwyg-editor/css/froala_style.min.css" rel=“stylesheet” type=“text/css” /> <!– 引入jquery –> <!– Include Editor JS files. –> <script type=“text/javascript” src="/public/admin/wysiwyg-editor/js/froala_editor.pkgd.min.js"></script> <script type=“text/javascript” src="/public/admin/wysiwyg-editor/js/zh_cn.js"></script> <!– 批量上传图片插件 –> <link rel=“stylesheet” type=“text/css” href="/public/admin/webuploader/css/webuploader.css"> <link rel=“stylesheet” type=“text/css” href="/public/admin/webuploader/css/diyUpload.css"> <script type=“text/javascript” src="/public/admin/webuploader/js/webuploader.html5only.min.js"></script> <script type=“text/javascript” src="/public/admin/webuploader/js/diyUpload.js"></script> <div class=“panel panel-default”> <div class=“panel-body”> <div class=“table-responsive input-form”> <form action="/admin/goods/doEdit?_csrf=<%=csrf%>" method=“post” class=“goods_content” enctype=“multipart/form-data”> <!– Nav tabs –> <ul class=“nav nav-tabs” role=“tablist”> <li role=“presentation” class=“active”><a href="#general" role=“tab” data-toggle=“tab”>通用信息</a></li> <li role=“presentation”><a href="#detail" role=“tab” data-toggle=“tab”>详细描述</a></li> <li role=“presentation”><a href="#mix" role=“tab” data-toggle=“tab”>其他信息</a></li> <li role=“presentation”><a href="#attribute" role=“tab” data-toggle=“tab”>规格与包装</a></li> <li role=“presentation”><a href="#photo" role=“tab” data-toggle=“tab”>商品相册</a></li> </ul> <!– Tab panes –> <div class=“tab-content”> <div role=“tabpanel” class=“tab-pane active” id=“general”> <input type=“hidden” name=“id” value="<%=goods._id%>" /> <ul class=“form_input”> <li> <span> 商品标题:</span> <input type=“text” name=“title” class=“input” value="<%=goods.title%>" /></li> <li> <span> 附属标题:</span> <input type=“text” name=“sub_title” class=“input” value="<%=goods.sub_title%>"/></li> <li> <span>商品版本:</span> <input type=“text” name=“goods_version” class=“input"value="<%=goods.goods_version%>” /></li> <li> <span>所属分类:</span> <select name=“cate_id” id=“cate_id”> <%for(var i=0;i<goodsCate.length;i++){%> <option value="<%=goodsCate[i]._id%>" <%if(goods.cate_id.toString()==goodsCate[i]._id.toString()){%>selected<%}%> ><%=goodsCate[i].title%></option> <%for(var j=0;j<goodsCate[i].items.length;j++){%> <option value="<%=goodsCate[i].items[j]._id%>" <%if(goods.cate_id.toString()==goodsCate[i].items[j]._id.toString()){%>selected<%}%>>—-<%=goodsCate[i].items[j].title%></option> <%}%> <%}%> </select> <input type=“hidden” name=“cname” id=“cname” /> </li> <li> <span> 商品图片:</span> <input type=“file” name=“goods_img”/> <span> </span> <img class=“pic” src="<%=goods.goods_img%>" /> </li> <li> <span>商品价格:</span> <input type=“text” name=“shop_price” value="<%=goods.shop_price%>"/></li> <li> <span>商品原价:</span> <input type=“text” name=“market_price” value="<%=goods.market_price%>"/></li> <li> <span>商品状态:</span>  <input type=“radio” name=“status” <%if(goods.status==1){%> checked <%}%> value=“1” id=“a”/> <label for=“a”>显示</label> <input type=“radio” name=“status” <%if(goods.status==0){%> checked <%}%> value=“0” id=“b”/><label for=“b”>隐藏</label> </li> <li> <span>加入推荐:</span> <input type=“checkbox” value=“1” <%if(goods.is_best==1){%> checked <%}%> name=“is_best”/> 精品 <input type=“checkbox” value=“1” name=“is_hot” <%if(goods.is_hot==1){%> checked <%}%> /> 热销 <input type=“checkbox” value=“1” name=“is_new” <%if(goods.is_new==1){%> checked <%}%> /> 新品 </li> </ul> </div> <div role=“tabpanel” class=“tab-pane” id=“detail”> <textarea name=“goods_content” id=“content” cols=“100” rows=“8”><%=goods.goods_content%></textarea> </div> <div role=“tabpanel” class=“tab-pane” id=“mix”> <ul class=“form_input”> <li> <span>商品颜色:</span> <%for(var i=0;i<colorResult.length;i++){%> <%if(goods.goods_color.indexOf(colorResult[i]._id.toString())!=-1){%> <input type=“checkbox” checked name=“goods_color” value="<%=colorResult[i].id%>" id=“color<%=colorResult[i].id%>” /> <label for=“color<%=colorResult[i]._id%>"><%=colorResult[i].color_name%></label> <%}else{%> <input type=“checkbox” name=“goods_color” value="<%=colorResult[i].id%>” id=“color<%=colorResult[i].id%>” /> <label for=“color<%=colorResult[i]._id%>"><%=colorResult[i].color_name%></label> <%}%> <%}%> </li> <li> <span>关联商品:</span> <input type=“text” name=“relation_goods” class=“relation_goods” value="<%=goods.relation_goods%>”/> <i>填写关联商品的id 多个以逗号隔开 格式:23,24,39</i> </li> <li> <span>关联赠品:</span> <input type=“text” name=“goods_gift” class=“goods_gift” value="<%=goods.goods_gift%>"/> <i>可为空 格式:23-2,39-5 说明:例如23-2 中的23表示商品id,2表示商品数量</i> </li> <li> <span>关联配件:</span> <input type=“text” name=“goods_fitting” class=“goods_fitting” value="<%=goods.goods_fitting%>"/> <i>可为空 格式:23-2,39-5 说明:例如23-2 中的23表示商品id,2表示商品数量</i> </li> <li> <span>更多属性:</span> <input type=“text” name=“goods_attr” class=“goods_attr” value="<%=goods.goods_attr%>"/> <i> 格式: 颜色:红色,白色,黄色 | 尺寸:41,42,43</i> </li> <li> <span>Seo关键词:</span> <input type=“text” name=“goods_keywords” class=“goods_keywords” value="<%=goods.goods_keywords%>"/> </li> <li> <span>Seo描述:</span> <textarea name=“goods_desc” id=“goods_desc” cols=“100” rows=“2”><%=goods.goods_desc%></textarea> </li> </ul> </div> <div role=“tabpanel” class=“tab-pane” id=“attribute”> <ul class=“form_input”> <li> <span>商品类型: </span> <select name=“goods_type_id” id=“goods_type_id”> <option value=“0”>–请选择商品类型–</option> <%for(var i=0;i<goodsType.length;i++){%> <option value="<%=goodsType[i]._id%>" <%if(goods.goods_type_id.toString()==goodsType[i]._id.toString()){%>selected<%}%> ><%=goodsType[i].title%></option> <%}%> </select> </li> </ul> <ul class=“form_input” id=“goods_type_attribute”> <%-goodsAtts%> </ul> </div> <div role=“tabpanel” class=“tab-pane” id=“photo”> <div id=“goods_image”> <ul id=“goods_image_list” class=“goods_image_list clear”> <%for(var i=0;i<goodsImage.length;i++){%> <li> <img class=“pic” src="<%=goodsImage[i].img_url%>" /> <div class=“color_list”> <select class=“relation_goods_color” goods_image_id="<%=goodsImage[i]._id%>"> <option value=“0”>关联颜色</option> <%for(var j=0;j<goodsColor.length;j++){%> <option value="<%=goodsColor[j]._id%>" <%if(goodsImage[i].color_id.toString()==goodsColor[j]._id){%>selected<%}%> ><%=goodsColor[j].color_name%></option> <%}%> </select> </div> <div class=“goods_image_delete” goods_image_id="<%=goodsImage[i]._id%>"></div> </li> <%}%> </ul> </div> <div id=“photoLib” class=“photoLib”></div> <div id=“photoList”> </div> </div> </div> <button type=“submit” class=“btn btn-success goods_content_btn”>提交</button> </form> </div> </div> </div> <!– 缓存当前的属性信息 –> <div id=“goods_attr_value” style=“display:none”> <%-goodsAtts%> </div><script> $(function(){ //关联商品类型 $(’#goods_type_id’).change(function(){ // alert($(this).val()); var cate_id=$(this).val(); if(cate_id==’<%=goods.goods_type_id.toString()%>’){ $(’#goods_type_attribute’).html($(’#goods_attr_value’).html()); }else{ var data=’’; $.get(’/admin/goods/goodsTypeAttribute?cate_id=’+cate_id,function(response){ data=response.result; var str=""; for(var i=0;i<data.length;i++){ if(data[i].attr_type==1){ str+=’<li><span>’+data[i].title+’:  </span><input type=“hidden” name=“attr_id_list” value="’+data[i]._id+’" /> <input type=“text” name=“attr_value_list” /></li>’ }else if(data[i].attr_type==2){ str+=’<li><span>’+data[i].title+’:  </span> <input type=“hidden” name=“attr_id_list” value="’+data[i]._id+’"> <textarea cols=“50” rows=“3” name=“attr_value_list”></textarea></li>’ }else{ var arr=data[i].attr_value.split(’\n’); str+=’<li><span>’+data[i].title+’:  </span><input type=“hidden” name=“attr_id_list” value="’+data[i]._id+’">’; str+=’<select name=“attr_value_list”>’; for(var j=0;j<arr.length;j++){ str+=’<option value="’+arr[j]+’">’+arr[j]+’</option>’; } str+=’</select>’; str+=’</li>’; } } $(’#goods_type_attribute’).html(str); }) } }) }) //富文本编辑器 $(function() { $(’#content’).froalaEditor({ height: 300, //给编辑器设置默认的高度 language: ‘zh_cn’, imageUploadURL: ‘/admin/goods/goodsUploadImage’, //根据不同的分辨率加载不同的配置 toolbarButtons: [‘fullscreen’, ‘bold’, ‘italic’, ‘underline’, ‘strikeThrough’, ‘subscript’, ‘superscript’, ‘|’, ‘fontFamily’, ‘fontSize’, ‘color’, ‘inlineStyle’, ‘paragraphStyle’, ‘|’, ‘paragraphFormat’, ‘align’, ‘formatOL’, ‘formatUL’, ‘outdent’, ‘indent’, ‘quote’, ‘-’, ‘insertLink’, ‘insertImage’, ‘insertVideo’, ’embedly’, ‘insertFile’, ‘insertTable’, ‘|’, ’emoticons’, ‘specialCharacters’, ‘insertHR’, ‘selectAll’, ‘clearFormatting’, ‘|’, ‘print’, ‘spellChecker’, ‘help’, ‘html’, ‘|’, ‘undo’, ‘redo’], toolbarButtonsMD: [‘fullscreen’, ‘bold’, ‘italic’, ‘underline’, ‘strikeThrough’, ‘subscript’, ‘superscript’, ‘|’, ‘fontFamily’, ‘fontSize’, ‘color’, ‘inlineStyle’, ‘paragraphStyle’, ‘|’, ‘paragraphFormat’, ‘align’, ‘formatOL’, ‘formatUL’, ‘outdent’, ‘indent’, ‘quote’, ‘-’, ‘insertLink’, ‘insertImage’, ‘insertVideo’, ’embedly’, ‘insertFile’, ‘insertTable’, ‘|’, ’emoticons’, ‘specialCharacters’, ‘insertHR’, ‘selectAll’, ‘clearFormatting’, ‘|’, ‘print’, ‘spellChecker’, ‘help’, ‘html’, ‘|’, ‘undo’, ‘redo’], toolbarButtonsSM: [‘fullscreen’, ‘bold’, ‘italic’, ‘underline’, ‘strikeThrough’, ‘subscript’, ‘superscript’, ‘|’, ‘fontFamily’, ‘fontSize’, ‘color’, ‘inlineStyle’, ‘paragraphStyle’, ‘|’, ‘paragraphFormat’, ‘align’, ‘formatOL’, ‘formatUL’, ‘outdent’, ‘indent’, ‘quote’, ‘-’, ‘insertLink’, ‘insertImage’, ‘insertVideo’, ’embedly’, ‘insertFile’, ‘insertTable’, ‘|’, ’emoticons’, ‘specialCharacters’, ‘insertHR’, ‘selectAll’, ‘clearFormatting’, ‘|’, ‘print’, ‘spellChecker’, ‘help’, ‘html’, ‘|’, ‘undo’, ‘redo’] }); }); //批量上传图片 $(function(){ var photoStr=’’; $(’#photoLib’).diyUpload({ url:’/admin/goods/goodsUploadPhoto’, success:function( response ) { // console.info( data ); photoStr=’<input type=“hidden” name=“goods_image_list” value=’+response.link+’ />’; $(’#photoList’).append(photoStr); }, error:function( err ) { console.info( err ); } }); }) $(function(){ //改变颜色 $(’.relation_goods_color’).change(function(){ var color_id=$(this).val(); var goods_image_id=$(this).attr(‘goods_image_id’); console.log(color_id,goods_image_id); $.post(’/admin/goods/changeGoodsImageColor?_csrf=<%=csrf%>’,{color_id:color_id,goods_image_id:goods_image_id},function(response){ console.log(response); }) }) //删除图片 $(’.goods_image_delete’).click(function(){ var _that=this; var flag=confirm(‘您确定要删除吗?’); if(flag){ var goods_image_id=$(this).attr(‘goods_image_id’); $.post(’/admin/goods/goodsImageRemove?_csrf=<%=csrf%>’,{goods_image_id:goods_image_id},function(response){ console.log(response); if(response.success){ $(_that).parent().remove(); } }) } }) }) </script></body></html>效果