博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
egg(63,64,65)--商品分类的curd,上传图片时生成多种分辨率的图片,表单最多提交个数...
阅读量:6687 次
发布时间:2019-06-25

本文共 9539 字,大约阅读时间需要 31 分钟。

model

app/model/goods_cate.js
module.exports = app => {    const mongoose = app.mongoose;    const Schema = mongoose.Schema;    var d=new Date();       const GoodsCateSchema = new Schema({      title:{ type:String },      cate_img: { type: String  },      filter_attr: { type: String  },      //筛选id      link:{ type: String  },        template:{ /*指定当前分类的模板*/          type:String      },      pid:{          type:Schema.Types.Mixed  //混合类型       },      sub_title:{  /*seo相关的标题  关键词  描述*/        type:String      },      keywords:{        type:String      },      description:{        type:String      },      status: { type: Number,default:1  },          add_time: {                   type:Number,                default: d.getTime()          }    });     return mongoose.model('GoodsCate', GoodsCateSchema,'goods_cate');  }

router.js

router.get('/admin/goodsCate', controller.admin.goodsCate.index);   router.get('/admin/goodsCate/add', controller.admin.goodsCate.add);   router.post('/admin/goodsCate/doAdd', controller.admin.goodsCate.doAdd);

增加

controller

app/controller/admin/goodsCate.js
async add(){    var result = await this.ctx.model.GoodsCate.find({'pid':'0'})    await this.ctx.render('admin/goodsCate/add',{        cateList:result    });  }  async doAdd(){    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            })            }             if(parts.field.pid!=0){            parts.field.pid=this.app.mongoose.Types.ObjectId(parts.field.pid);    //调用mongoose里面的方法把字符串转换成ObjectId                 }    let goodsCate =new this.ctx.model.GoodsCate(Object.assign(files,parts.field));    await goodsCate.save();    await this.success('/admin/goodsCate','增加分类成功');  }

view

app/view/admin/goodsCate/add.html
  1. 一级分类的pid是0,顶级分类
  2. 二级分类的pid_id,一级分类(如下图的手机/电话卡)
<%- include ../public/page_header.html %>
增加商品分类
  • 分类名称:
  • 上级分类:
  • 分类图片:
  • 筛选属性:
  • 跳转地址:
  • 分类模板: 空表示默认模板
  • Seo标题:
  • Seo关键词:
  • Seo描述:
  • 排  序:
  • 状  态:  

效果

clipboard.png

查找

controller

app/controller/admin/goodsCate.js
  1. 通过pid关联自己查询
  2. match筛选pid为0的数据
async index() {    var result=await this.ctx.model.GoodsCate.aggregate([             {          $lookup:{            from:'goods_cate',            localField:'_id',            foreignField:'pid',            as:'items'                }             },       {          $match:{            "pid":'0'          }       }       ])    console.log(JSON.stringify(result));    await this.ctx.render('admin/goodsCate/index',{      list:result    });  }

view

app/view/admin/goodsCate/index.html
<%- include ../public/page_header.html %>            
商品分类列表
增加商品分类
<%for(var i=0;i
<%for(var j=0;j
<%}%> <%}%>
分类名称 分类图片 排序 状态 操作
<%=list[i].title%> <%=list[i].sort%> <%if(list[i].status==1){%> <%}else{%> <%}%>  修改 删除
-----<%=list[i].items[j].title%> <%=list[i].items[j].sort%> <%if(list[i].status==1){%> <%}else{%> <%}%>  修改 删除

效果

  1. 红色为一级分类
  2. 蓝色为二级分类

clipboard.png

clipboard.png

上传图片时,生成多种分辨率的图片

安装依赖

cnpm install jimp --save

service

app/service/tools.js
  1. resize 尺寸
  2. quality 质量
  3. write 名字
const Jimp = require("jimp");  //生成缩略图的模块  async jimpImg(target){    //上传图片成功以后生成缩略图    Jimp.read(target, (err, lenna) => {     if (err) throw err;                     lenna.resize(200, 200) // 尺寸               .quality(90) // 质量                                .write(target+'_200x200'+path.extname(target)); // save            lenna.resize(400, 400) // 尺寸               .quality(90) // 质量                                 .write(target+'_400x400'+path.extname(target)); // save     }); }

controller

app/controller/admin/goodsCate.js
增加一行
this.service.tools.jimpImg(target);
async doAdd(){    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            })        this.service.tools.jimpImg(target);            }             if(parts.field.pid!=0){            parts.field.pid=this.app.mongoose.Types.ObjectId(parts.field.pid);    //调用mongoose里面的方法把字符串转换成ObjectId                 }    let goodsCate =new this.ctx.model.GoodsCate(Object.assign(files,parts.field));    await goodsCate.save();    await this.success('/admin/goodsCate','增加分类成功');  }

效果

clipboard.png

clipboard.png

编辑

controller

app/controller/admin/goodsCate.js
async edit() {    var id = this.ctx.request.query.id;    var result = await this.ctx.model.GoodsCate.find({      "_id": id    });    var cateList = await this.ctx.model.GoodsCate.find({      "pid": '0'    });    await this.ctx.render('admin/goodsCate/edit', {      cateList: cateList,      list: result[0]    });  }  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      })      //生成缩略图      this.service.tools.jimpImg(target);    }    if (parts.field.pid != 0) {      parts.field.pid = this.app.mongoose.Types.ObjectId(parts.field.pid); //调用mongoose里面的方法把字符串转换成ObjectId             }    var id = parts.field.id;    var updateResult = Object.assign(files, parts.field);    await this.ctx.model.GoodsCate.updateOne({      "_id": id    }, updateResult);    await this.success('/admin/goodsCate', '修改分类成功');  }

view

app/view/admin/goodsCate/edit.html
<%- include ../public/page_header.html %>    
编辑商品分类
  • 分类名称:
  • 上级分类:
  • 分类图片:
  • 筛选属性:
  • 跳转地址:
  • 分类模板: 空表示默认模板
  • Seo标题:
  • Seo关键词:
  • Seo描述:
  • 排  序:
  • 状  态: <%if(list.status==1){%> checked <%}%> value="1" id="a"/> <%if(list.status==0){%> checked <%}%> name="status" value="0" id="b"/>  

效果

默认选中上级分类

clipboard.png

表单最多提交个数

  1. egg默认设置表单提交个数为10
  2. Reach fields limit (code: Request_fields_limit) 翻译后 达到字段限制(代码:Request_fields_limit)

修改config,自定义个数

config/config.default.js
config.multipart = {      fields: '50'   };

clipboard.png

转载地址:http://vfeao.baihongyu.com/

你可能感兴趣的文章
阿里建“猫茂”线下购物中心,将实现新零售技术的真正落地
查看>>
高等教育转型:确保数据可用性是关键
查看>>
【基础】这15种CSS居中的方式,你都用过哪几种?
查看>>
网站的通用注册原型设计
查看>>
硬纪元AI峰会实录|公子小白严汉明:这是智能机器人最好的时代
查看>>
CES Asia专题|臻迪携“高颜值”家族集体亮相
查看>>
验证码对抗之路及现有验证机制介绍
查看>>
canvas绘制星空
查看>>
bootstrap大图轮播手机端不能手指滑动解决办法
查看>>
转置字符串,其中单词内的字符需要正常
查看>>
Spring的lookup-method标签
查看>>
抽象类、接口
查看>>
第十章 网络文件共享服务之ftp
查看>>
Spring的事件和监听器
查看>>
服务器开发入门——理解异步I/O
查看>>
8Manage装配式一体化管理如何解决集成窘境
查看>>
[翻译]Axure-Masters-原型设计工具Axure学习-第2.2节
查看>>
一文看清深圳云栖阿里云重磅产品发布
查看>>
ELK部署参考文档
查看>>
Dcloud中mui 微信支付和支付宝支付接口完美实现付款代码(PHP支付宝demo)
查看>>