复杂值工程化 具体见day18/note文件夹
有如下数据:
-
用户:
{ loginId:"账号", //必填,唯一(索引),长度3-18,去除前后空格 loginPwd:"密码",//必填,去除前后空格,查询时不显示 name:"姓名",//必填,去除前后空格,长度2-10 age:18,//数字,默认值18 loves: ["爱好"],//数组,默认空数组 address: { //必填 province: "省份", city: "城市" } }
-
用户操作:
{ operation: "登录",//必填,索引,去除前后空格,值只能在["登录", "注销", "发布文章", "发布评论", "阅读文章"]中选择 time: 日期,//Date类型,默认值当前时间 userid: 用户的id,//关联用户的id extraInfo: 任意对象, // 操作额外的对象,默认值空对象 address: { // 必填,操作的地址 province: "省份", city: "城市" } }
整体结构
1、由于两个数据都对地址有一样的要求,所以需要把地址单独模块化,然后直接引入。
/* 引入文件 */
const mongo=require('mongoose');
/* 数据格式 */
const ressSchema=new mongo.Schema({
province:{
type:String,//字符串类型
required:true,//必填
},
city:{
type:String,
required:true,
}
});
/* 暴露出数据 */
module.exports=ressSchema;
2、用户信息格式模块化,后面直接引用。
/* 引入文件 */
let mongo=require('mongoose');
let address=require('./address(用户地址格式).js');
/* 数据格式 */
const uesrInfo=new mongo.Schema({
loginId:{
type:String,
required:true,//必填
index:true,//索引,类似于目录
unique:true,//唯一性
minlength:1,//最小长度
maxlength:18,//最大长度
trim:true,//去除左右空格
},
loginPwd:{
type:String,
required:true,//必填
trim:true,//去除左右空格
select:false,//查询不显示
},
name:{
type:String,
required:true,//必填
minlength:2,//最小长度
maxlength:10,//最大长度
trim:true,//去除左右空格
},
age:{
type:Number,
default:18,
},
loves:{
type:[String],//数组类型
default:[], //默认空数组
},
address:{
type:address,//引用格式
required:true,
}
});
/* 创建数据模型
1:数据模型名称
2:数据结构
3:数据模型对应的数据库中的数据集合名称
*/
let usersModel=mongo.model('usersModel',uesrInfo,'uesrInfo');//第三个参数是一个数据库里面的集合
/* 暴露出数据 */
module.exports=usersModel;
3、设置用户操作的范围,只能是其中一个。
module.exports = ["登录", "注销", "发布文章", "发布评论", "阅读文章"];
4、创建用户操作模块,其中需要注意userId和生成用户自动添加的Id一样,便于可以知道是谁在操作,其中enum是之前设置操作范围,选其一。
/* 引入文件 */
let mongo=require('mongoose');
let address=require('./address(用户地址格式)');
let functions=require('./function(功能)');
/* 数据格式 */
const useropt=new mongo.Schema({
operation:{
type:String,
required:true,
trim:true,
enum:functions,//功能选1
},
time:{
type:Date,
default:Date.now,//默认当前时间
},
userid:{
type:mongo.Types.ObjectId,//和用户信息表关联,知道每一次操作是谁在操作
required:true,
ref:"usersModel" ,//要进行关联查询是引入关联的usersModel的名字,该名字是导出model的第一个参数的名字,要一致
},
extraInfo:{
type: Object,
default: {},
}, //任意对象,
address: { // 必填,操作的地址
type: address,
required:true,
}
});
/* 创建数据模型
1:数据模型名称
2:数据结构
3:数据模型对应的数据库中的数据集合名称
*/
let usersoptModel=mongo.model('usersoptModel',useropt,'uesropt');//第三个参数是一个数据库里面的集合
/* 暴露出数据 */
module.exports=usersoptModel;
5、与数据库建立连接。
/* 引入文件 */
let mongo=require('mongoose');
/* 连接数据库 */
mongo.connect('mongodb://127.0.0.1/stus',{
useNewUrlParser: true,//为可选参数,也是之前老版本去除警告需要的参数
useUnifiedTopology: true,
});
/* 连接成功后执行打印 */
mongo.connection.on('connected',()=>{
console.log('已和数据库连接!');
});
6、把以上的功能合并在一起并暴露出去,方便入口文件或者其他模块使用。
/* 导入文件 */
require('./create(连接).js');
let userInfo = require("./userInfo(用户信息)");
let useropt = require("./useropt(用户操作)");
/* 暴露出去 */
module.exports.userInfo = userInfo;
module.exports. useropt = useropt;
7、由于入口文件外部index.js只进行简单的传值调用,所以需要单独把增删查改方法进行封装-对用户信息进行操作。
let {userInfo,useropt} = require("../modules/index(统一合并导出).js");
/* 查找方法 */
async function find(){
let result = await userInfo.find();
return result;
}
/* 通过Id查找用户 */
async function findUser(id){
let result = await userInfo.findById(id);
return result;
}
/* 模糊查询,通过条件查询 skip(0)里面的值就是代表跳过几个 */
/**
* 按条件分页查询数据,如果filter提交为空,则查询所有数据
* @param {Object} filter 查询条件
* @param {Number} page 当前页
* @param {Number} limit 每页显示的数量
* @returns
*/
async function query(filter,page ,limit=5){
//分页公式 (page-1)*limit
let result = await userInfo.find(filter).skip((page-1)*limit).limit(limit);//表示只出现0-5条数据,后面得值是页面固定的条数
return result;
}
/* 添加 */
async function addUser(user){
let result = await userInfo.create(user);
return result;
}
/* 添加多个 */
async function addUsers(users){
let result = await userInfo.insertMany(users);
return result;
}
/* 修改 */
async function updateUser(id,user){
let result = await userInfo.update({_id:id},user);
return result;
}
/* 删除 */
async function deleteUser(id){
let result = await userInfo.remove({_id:id});
return result;
}
module.exports.find = find;
module.exports.findUser = findUser;
module.exports.addUser = addUser;
module.exports.updateUser = updateUser;
module.exports.deleteUser = deleteUser;
module.exports.query = query;
module.exports.addUsers= addUsers;
8、由于入口文件外部index.js只进行简单的传值调用,所以需要单独把增删查改方法进行封装-对用户操作进行操作。
let {userInfo,useropt} = require("../modules/index(统一合并导出).js");
/**
* 查询所有操作记录并显示操作人信息
* @returns {Promise<*>} 操作记录
*/
async function query(){
let result = await useropt.find().populate("userid","loginId name");
//populate("userid","loginId name")通过Id把用户信息显示,第二个参数可以指定显示哪一些,不写就是全部显示
return result;
}
/* 暴露 */
module.exports.query = query;
9、也可使用mock直接批量生成数据并传入数据库。
let Mock = require("../node_modules/mock/mock.js");
const { pick } = require("../modules/address(用户地址格式).js");
let users = Mock.mock({
"datas|20-25": [{
"loginId": /[A-Za-z0-9_]{3,9}/,//正则
"loginPwd": "@word(3,9)",
"name": "@cname",
"age|18-30": 1,
"loves|1-4":['@pick(["电影","阅读","旅游","游戏","运动","购物"])'],
"address": {
"province": "@province",
"city": "@city",
}
}]
}).datas;
/* 暴露数据 */
module.exports = users;
10、入口文件直接进行调用操作。
// let {userInfo,useropt} = require("./modules/index(统一合并导出).js");
let mongo=require('mongoose');
let Dao=require("../note/userDao(增删查改操作)/dao.js");//直接使用方法
let optDao=require("../note/userDao(增删查改操作)/optDao.js");//直接使用方法
let Date=require("./mock/usersMock.js");//引入数据
/* 批量添加 使用mock生成的数据批量导入*/
Dao.addUsers(Date).then((data) => {
console.log(data);
});
/* 用户操作部分 useropt*/
optDao.query({}).then((data) => {
console.log(data);
}
);
/* 新加用户 */
// let user = new userInfo({
// loginId:"15",
// loginPwd:"123466",
// name:"赵鑫勇",
// age:18,
// loves:["阅读","游戏"],
// address:{
// province:"四川",
// city:"成都"
// }
// });
// user.save((err,data)=>{
// if(err) throw err;
// console.log(data);
// });
/* 新加操作 */
// async function add() {
// let obj = {
// operation:"登录",
// userid:mongo.Types.ObjectId("62450e58b83caa72ee5dbf68"),
// address:{
// province:"四川",
// city:"成都"
// }
// };
// await useropt.create(obj);
// }
// add();
/* 用户操作部分 useropt*/
//查询所有用户
Dao.find().then(data=>{
console.log(data);
});
//根据id查询某个用户
Dao.findUser("6245125aacff32bda3d8c04b")
.then(data=>{
console.log(data);
});
//根据id删除某个用户
Dao.deleteUser("62450e34ca786b221c071332").then(data=>{
console.log(data);
})
/* 修改 */
Dao.updateUser("6245125aacff32bda3d8c04b",{
name:"张三思2222",
age:23,
loves:["旅游"],
address:{
province:"四川",
city:"绵阳"
}
}).then(data=>{
console.log(data);
})
/* 新增 */
Dao.addUser({
name: "赵思",
loginId: "zhangisi",
loginPwd: "123456",
age: 23,
loves: ["旅游"],
address: {
province: "四川",
city: "绵阳",
},
}).then((data) => {
console.log(data);
});
/* 模糊查询 */
Dao.query({ name: { $regex: "张" } }).then((data) => {
console.log(data);
});