四:后台数据库设计(化妆品表格)

1.数据库字段的设计:

  1.1.在数据库moon中新建表格“MakeUp”

  1.2.具体的字段含义:

    brand: "", //商品的类型

  careType:" ", //护理类型 //可选值:facialCare:面部护理类型 ; perfumeCosmetics:香水彩妆类型 ;img:[ ],//商品图片

   useType:" " , //用途类型,可选值:“口红” ;“化妆工具” ;“BB霜” ; “防晒霜” ;“洗面奶” ; “水” ; “乳”; ...........等

   originPrice:number , //未打折价格

   newPrice:number , //打折价格

    goodsName:" " , //商品名称

     goodsDescribe:" " ,//商品描述

      goodsDetail:" " ,//商品详情,在商品详情中的商品详情描述图片,是一个字符串类型的图片地址

    stock:number , //库存量

    monthlySales:number , //月销售量

    SalesCount:number, //总销售量

    productionPlace:"" //产地

2.mongoose的使用:

  2.1.基于对新知识的学习热情,虽然前面是有用到对mongodb的封装allhandlers.js,,基本可以达到我目前的功能,但是基于好奇现在开发的话用mongodb大多数可能都选择用mongoose来过度使用mongodb,so我也去研究了下,前面有博文写到基本的mongoose的使用,个人是感觉使用mongoose的话,会让mongo数据库在使用时更容易语义化,和操作,更稳定吧。

  2.2.进入后台项目文件夹routes 新建文件夹Model,在里面新建文件AllHandler.js文件,对mongoose操作做一个基本的增删改查的封装,具体代码如下:

var assert = require(‘assert‘); //断言包
//这个页面来封装基本的增删改查的方法

//增
var add = function(Mod, selector, fn) { //参数1是实例化的Model,参数2是需要新增的内容
    var model = new Mod(selector[0]);
    try {
        model.save(function(err, res) {
            assert.equal(err, null);
            fn(res)
        })
    } catch (ex) {
        console.log("AllHandler报错:" + ex);
        fn([]);
    }

}

//查
//查所有根据条件
var find = function(Mod, selector, fn) {
    try {
        Mod.find(selector[0], selector[1] ? selector[1] : "", function(err, res) {
            assert.equal(err, null);
            fn(res)
        })
    } catch (ex) {
        console.log("AllHandler报错:" + ex);
        fn([]);
    }

}

//通过ID更新某条数据
var updateById = function(Mod, selector, fn) {
    var id = selector[0].id;
    var updatestr = selector[1];
    try {
        Mod.findByIdAndUpdate(id, updatestr, function(err, res) {
            if (err) {
                assert.equal(err, null);
            } else {
                fn(res);
            }
        })
    } catch (ex) {
        console.log("AllHandler报错:" + ex);
        fn(null);
    }

};

//通过ID来删除一条数据
var deleteById = function(Mod, selector, fn) {
    var id = selector[0].id;
    try {
        Mod.findByIdAndRemove(id, function(err, res) {
            if (err) {
                assert.equal(err, null);
            } else {
                fn(res);
            }
        })

    } catch (ex) {
        console.log("AllHandler报错:" + ex);
        fn(null);
    }

};

//通过条件来删除所有符合条件的
var deleteByStr = function(Mod, selector, fn) {
    var conditions = selector[0];
    try {
        Mod.remove(conditions, function(err, res) {
            if (err) {
                assert.equal(err, null);
            } else {
                fn(res);
            }
        })
    } catch (ex) {
        console.log("AllHandler报错:" + ex);
        fn(null);
    }

}

//分页
var page = function(Mod, selector, fn) {
    var pageSize = selector[1].pageSize || 5; //一页多少条
    var currentPage = selector[1].currentPage || 1; //当前第几页
    var skipnum = (currentPage - 1) * pageSize; //跳过数
    try {
        var results;
        var count;
        Mod.count(selector[0], function(err, result2) {
            assert.equal(err, null);
            count = result2;
        });
        /* Mod.find({}, function(err, res) { //在mongoose中第一个参数查询条件必须是一个json集合对象,如果是空写成{},而不能是“”;
                 assert.equal(err, null);
                 console.log(res)
                 fn(res)
             })*/
        Mod.find(selector[0]).skip(skipnum).limit(pageSize).exec(function(err, res) {
            //console.log("hahaha")
            assert.equal(err, null);
            if (res) {
                results = res;
                //console.log(count, results)
                fn(results, count);
            }

        });

    } catch (ex) {
        console.log("AllHandler报错:" + ex);

    }
}

var OperateType = {
    add: add,
    find: find,
    findSome: find,
    page: page,
    deleteByStr: deleteByStr,
    deleteById: deleteById,
    updateById: updateById

};

module.exports = function(Mod, i, selector, fn) { //model ; 参数 ; 回调函数
    OperateType[i](Mod, selector, fn);
}

  2.3.然后还是继续在上面的Model文件夹中,新建一个基本连接的文件MyMongoose.js文件,进行连接数据库操作,具体代码如下:

var mongoose = require(‘mongoose‘);
var Url = "mongodb://localhost:27017/moon"; //要用到的数据库moon;
var db = mongoose.connect(Url);

// 监听连接成功
mongoose.connection.on(‘connected‘, function() {
    console.log("成功连接到数据库:" + Url)
})

//监听连接异常
mongoose.connection.on(‘error‘, function(err) {
    console.log("连接数据库出现异常:" + err)
})

//监听连接断开
mongoose.connection.on(‘disconnected‘, function() {
    console.log(‘连接数据库现在已经断开‘)
})

module.exports = {
    mongoose: mongoose,
    db: db
};

  2.4.然后还是在routes文件夹中新建文件ModelMakeUp.js,去定义化妆品表格的model的schema,以及增删改差的操作路由等,具体代码如下:

//MakeUp表的数据库操作
var express = require(‘express‘);
var router = express.Router();
var crypto = require(‘crypto‘);
var ObjectId = require(‘mongodb‘).ObjectId;
var mongoose = require(‘./Model/MyMongoose‘).mongoose;
var handle = require(‘./Model/AllHandler‘);
var formidable = require(‘formidable‘);
var fs = require(‘fs‘);

/*
        brand: "",  //商品的类型
        careType:" ", //护理类型  //可选值:facialCare:面部护理类型 ; perfumeCosmetics:香水彩妆类型 ;img:[ ],//商品图片
        useType:" " , //用途类型,可选值:“口红” ;“化妆工具” ;“BB霜” ; “防晒霜” ;“洗面奶” ; “水” ; “乳”; ...........等
        originPrice:number , //未打折价格
        newPrice:number , //打折价格
        goodsName:" " , //商品名称
        goodsDescribe:" " ,//商品描述
        goodsDetail:" " ,//商品详情,在商品详情中的商品详情描述图片,是一个字符串类型的图片地址
        stock:number , //库存量
        monthlySales:number , //月销售量
        SalesCount:number, //总销售量
        productionPlace:""  //产地
 */
var schema = mongoose.Schema;
var MakeUpSch = new schema({ //这个表的字段
    goodsName: String,
    goodsDescribe: String,
    goodsDetail: String,
    brand: String,
    careType: String,
    useType: String,
    originPrice: Number,
    newPrice: Number,
    productionPlace: String,
    img: { type: String, default: "http://localhost:3000/images/makeUp/啦.jpg" },
    stock: Number,
    SalesCount: Number,
    monthlySales: Number
});

var MolMakeUp = mongoose.model(‘MakeUp‘, MakeUpSch, ‘MakeUp‘);

//往表格里面插数据
router.post(‘/add‘, function(req, res) {
    var collection = [];
    if (req.body.collection.img == "") {
        req.body.collection.img = "http://localhost:3000/images/makeUp/啦.jpg"
    }
    collection[0] = req.body.collection;
    handle(MolMakeUp, ‘add‘, collection, function(result) {
        res.send(result)
    })
})

//查询表里所有数据
router.post("/find", function(req, res) {
    var collection = [{}];
    handle(MolMakeUp, ‘find‘, collection, function(result) {
        res.send(result)
    })
})

//查询表里符合条件的数据,并且筛选只要部分字段
router.post("/findSome", function(req, res) {
    var collection = [{}, {}];
    collection[1] = req.body.show;
    handle(MolMakeUp, ‘find‘, collection, function(result) {
        res.send(result)
    })
})

//根据ID删除表格的数据
router.post("/deleteById", function(req, res) {
    var id = req.body.id;
    var collection = [];
    collection[0] = { id: ObjectId(id) };
    handle(MolMakeUp, "deleteById", collection, function(result) {
        res.send(result)
    })
})

//根据ID来update更新数据
router.post("/updateById", function(req, res) {
    var id = req.body.selector._id;
    var collection = [];
    collection[0] = { id: ObjectId(id) };
    if (req.session.makeUp_imgPath != "" && req.session.makeUp_imgPath != null) {
        req.body.selector.img = req.session.makeUp_imgPath;
        console.log(req.body.selector.img[0]);
        console.log(req.session.makeUp_imgPath);
    }
    collection[1] = req.body.selector;
    handle(MolMakeUp, "updateById", collection, function(result) {
        res.send(result)
    })
})

//分页查询
router.post(‘/page‘, function(req, res) {
    var selector = [];
    selector[0] = {};
    selector[1] = {
        pageSize: req.body.rows, //每页展示几条数据
        currentPage: req.body.page //当前在第几页
    };
    //res.send("111")
    handle(MolMakeUp, ‘page‘, selector, function(result, count) {
        var result = { result: result, count: count }
        res.send(result);
    })

})

//wangEditor编辑器接口
//wangeditor上传图片的地址
router.post("/wangeditor/upload", function(req, res, next) {
    var form = new formidable.IncomingForm();
    //设置文件上传存放地址
    form.uploadDir = "./public/images/makeUp";
    //执行里面的回调函数的时候,表单已经全部接收完毕了。
    form.parse(req, function(err, fields, files) {
        //if(files.File){
        var oldpath = files.myFileName.path;
        var extname = files.myFileName.name;
        //新的路径由三个部分组成:时间戳、随机数、拓展名
        var newpath = "./public/images/makeUp/" + extname;
        //改名
        try {
            fs.rename(oldpath, newpath, function(err) {
                if (err) {
                    res.json({ errno: 1, data: [] });
                };
                var mypath = newpath.replace("./public", "http://localhost:3000");
                req.session.makeUp_imgPath = mypath;
                res.json({ errno: 0, data: [mypath] })
            });
        } catch (ex) {
            res.json({ errno: 1, data: null })
        }

    });
})

module.exports = router;

3.修改路由,让能访问到上面的路径,进入routes里面的routes.js修改成下面的代码:

// 主要的路由文件

module.exports = function(app) {
    app.use(‘/‘, require(‘./index‘))
    app.use(‘/users‘, require(‘./users‘))
    app.use(‘/ModelMakeUp‘, require(‘./ModelMakeUp‘)) //加这个
}

原文地址:https://www.cnblogs.com/chun321/p/9203267.html

时间: 2024-11-03 05:40:47

四:后台数据库设计(化妆品表格)的相关文章

第一篇:无角牛MVC通用后台数据库设计

v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} Normal 0 false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {

公交车路线查询系统后台数据库设计--换乘算法改进与优化

在<查询算法>一文中已经实现了换乘算法,但是,使用存储过程InquiryT2查询从“东圃镇”到“车陂路口”的乘车路线时,发现居然用了5分钟才查找出结果,这样的效率显然不适合实际应用.因此,有必要对原有的换乘算法进行优化和改进.在本文中,将给出一种改进的换乘算法,相比原有的算法,改进后的算法功能更强,效率更优. 1. “压缩”RouteT0 假设RouteT0有以下几行 如下图所示,当查询S1到S4的二次换乘路线时,将会产生3×2×4=24个结果 从图中可以看出,第1段路线中的3条线路的起点和站

数据库系统(四)---关系型数据库设计及E-R图

1.关系型数据库: 关系型数据库是一类采用关系模型作为逻辑数据模型的数据库系统,遵从数据库设计的基本步骤,包括:需求分析.概念结构设计.逻辑结构设计.物理结构设计.数据库实施.数据库的运行和维护等阶段. 概念结构设计与逻辑结构设计是关系数据库整个设计过程的关键. 2.关系数据库设计过程与各级模式 在关系数据库设计的不同阶段,会形成数据库的各级模式.   1)需求分析阶段,综合各个用户的应用需求:   2)概念结构设计阶段,形成独立于机器特点.独立于各个关系数据库管理系统产品的概念模式:   3)

MySQL(四)—— 数据库设计

一.多表之间的关系的分类 (一).一对一之间的关系 如:人和身份证 分析:一个人只有一个身份证,一个身份证只能对应一个人. (二).一对多(多对一)之间的关系 如:部门和员工 分析:一个部门有多个员工,一个员工只能有一个部门. (三).多对多之间的关系 如:学生和课程 分析:一个学生可以选择很多门课程,一个课程也可以被多个学生选择. 二.一对多(多对一)关系实现 如:部门和与员工 实现:在多的一方建立外键,指向一的一方的主键. 三.多对多关系实现 如:学生和课程 实现:多对多关系实现需要借助第三

python2.0_day19_后台数据库设计思路

from django.db import models # Create your models here. from django.contrib.auth.models import User course_type_choices = (('online',u'网络班'), ('offline_weekend',u'面授班(周末)'), ('offline_fulltime',u'面授班(脱产)'), ) # 校区表class School(models.Model): name = m

Mysql第四天 数据库设计

不考虑主备.集群等方案,基于业务上的设计主要是表结构及表间关系的设计. 而关于表中字段主要是依据业务来进行定义,我们能够指定的大概有这么几项: 存储引擎 一般用InnoDB,特殊需求特殊选用 字符集和校验规则 特别说一下校验规则是指两个字符之间的比較规则, 比方A=a的话就是不区分大写和小写,会影响order by等. bin通常是区分大写和小写的, 一般用general 字段定义 字段怎么选取类型 索引 后面再说 特殊用途表 比方做缓存,汇总等 字段的数据类型选择 三个原则: 更小的数据类型.

十四、数据库设计三范式

1.第一范式:主键.字段不能再分 定义:要求有主键,数据库中不能出现重复记录,每一个字段是原子性不能再分 2.第二范式:非主键字段完全依赖主键 定义:第二范式是建立在第一范式的基础之上,要求数据库中所有非主键字段完全依赖主键,不能产生部分依赖.(严格意义上讲,尽量不要使用联合主键)    在多对多的关系中,创建包含两张表主键的第三张关系表. 3.第三范式:非主键字段不能产生传递依赖于主键字段 定义:建立在第二范式的基础上,要求非主键字段不能产生传递依赖于主键字段       一对多的关系中,在多

基于Extjs的web表单设计器 第五节——数据库设计

这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extjs的web表单设计器 第四节——控件拖放 基于Extjs的web表单设计器 第五节——数据库设计 基于Extjs的web表单设计器 第六节——界面框架设计

网上外卖及订餐系统的数据库设计

背景:互联网越来越发达,宅男越来越宅,网上订餐送叫外卖的越来越多. 注:本文仅做后台数据库设计,不做系统功能设计. 一.数据库需求分析 1.用户分为游客.注册用户和管理员用户,只有登录用户才能进行网上订餐,游客仅能浏览餐厅及菜肴信息,只有管理员身份才能进行后台管理 2.一个餐厅设计一张菜单:一张订单对应一个送餐员,可以包含多个菜肴:一个客服管理员可以管理多张订单 3.每个菜肴从属于一个菜系,一个菜单,一个餐厅 4.一个用户可以选择多个菜肴,产生多个订单 5.一张菜单每次对应一个优惠活动 二.数据