关于前端:设计用户模块的schema

46次阅读

共计 6925 个字符,预计需要花费 18 分钟才能阅读完成。

schema

在计算机科学中,schema 通常指的是 数据结构的 定义 束缚

关系型数据库

在关系型数据库中,schema 指的是数据库中所有表格的定义和表格之间的关系束缚,包含每个表格的列名、数据类型、主键、外键等等。

如果要对一个关系型数据库进行查问或批改操作,就必须先定义好相应的 schema。

NoSQL 数据库

在 NoSQL 数据库中,schema 的概念略有不同。

NoSQL 数据库通常分为:

  • 文档型数据库、
  • 键 - 值型数据库、
  • 列族存储型数据库
  • 图形数据库等几种类型

在这些数据库中,schema 能够了解为数据模型的定义。

与关系型数据库相比,NoSQL 数据库更加灵便,容许存储非结构化或半结构化数据,因而其 schema 通常也比拟宽松。

例如,在 MongoDB 中,用于定义模型的工具 Mongoose 提供了对数据模型的定义和束缚,包含汇合(相似于关系型数据库的表)和文档的字段、数据类型、索引等方面的束缚。

MongoDB 中 schema(“模型”)

MongoDB 是一种非关系型数据库,它没有传统意义上的“schema”概念。

相比于关系型数据库中须要在创立表时定义固定的列(字段)和数据类型,MongoDB 存储的文档能够蕴含各种不同构造的数据,每个文档的字段也能够动静增加或删除。

而在应用 MongoDB 时,咱们通常须要确保应用程序对文档中所需数据存在一些独特的约定,比方应用雷同的字段名、数据类型等,以便于应用程序可能正确地解析和应用这些数据。

这些约定能够称之为 “模型”,这也是在 MongoDB 中最靠近于“schema”的概念。

在 MongoDB 中通常会应用 Mongoose 这样的工具来定义数据模型,其中包含对于汇合(相似于关系型数据库的表)和文档的字段、数据类型、索引等方面的束缚。

然而这些束缚是可选的,同时也能够在运行时进行批改。

因而,MongoDB 更加灵便,实用于须要频繁变动的数据结构或者不确定的数据模型场景。

更多精彩内容,请 微信搜寻“前端爱好者 戳我 查看

下面说过在 MongoDB 中,模型是由 Schema 对象 定义的数据结构。 那么 Schema 到底是什么?

Schema 是一个 JavaScript 对象,定义了文档中字段的类型、验证规定、默认值等属性。

通过定义 Schema,能够为文档指定一组预约义的属性和办法,使文档更加结构化和牢靠。

在创立模型时,咱们须要将定义好的 Schema 作为参数传入 Mongoose 的 model() 办法中,以便 Mongoose 将其编译为模型。

模型能够被视为与数据库交互的对象,能够用来执行 CRUD 操作,查问文档,更新文档等操作。

在应用 MongoDB 和 Mongoose 进行开发时,定义模型并应用它们来操作数据是十分常见的操作。

通常状况下,咱们会依据理论需要定义多个不同的模型,每个模型对应一种数据类型,以便更好地组织和治理数据。

设计用户模块的 schema

用户模块

用户模块是指在程序中负责 治理用户信息 权限 的模块。

该模块通常包含以下性能:

  • 用户 注册 登录:容许用户通过输出用户名和明码等信息注册新用户,或应用已有账号进行登录。
  • 用户 信息管理:能够编辑和查看用户信息,例如昵称、邮箱、头像等。
  • 权限 治理:对于不同的用户角色,能够管制其所能拜访的页面、性能,以及具体的操作权限。
  • 安全性 治理:爱护用户数据安全,包含避免 SQL 注入、XSS 攻打等攻击方式,并对用户明码等敏感信息进行加密存储。
  • 第三方登录:反对用户通过第三方平台(如微信、QQ、微博)进行快捷登录,并绑定相应账号。
  • 记住明码 主动登录:能够让用户在下次登录时主动填写用户名和明码,进步用户体验。

在实现用户模块时,须要先设计数据库表构造,包含用户信息表、角色表、权限表、登录日志表等,并依据业务需要实现相应的 API 接口和前端页面。

同时,须要思考到用户数据的安全性和隐衷爱护,例如对明码进行加密存储,采纳 HTTPS 协定传输数据等措施。

上面仅说一下用户信息表的 schema。

开始之前,先介绍 mongoose 创立 schema 中用到的几个 api

mongoose.Schema()

mongoose.Schema()是 Mongoose 中用于定义 MongoDB 文档构造的构造函数。

通过它,能够创立一个新的 Schema 对象,用于束缚 MongoDB 汇合中文档的构造和属性。

在定义 Schema 时,能够应用各种类型的数据,包含:

  • 字符串
  • 数字
  • 日期等根本类型
  • 嵌套其余 Schema 对象或者数组,
  • 增加虚构属性等。

此外,还能够为每个字段 配置默认值 验证规定 索引 等属性,以及自定义实例办法和静态方法。

mongoose.model()

mongoose.model()是 Mongoose 中用于创立数据模型的办法。

数据模型是用来定义 MongoDB 汇合(相似于关系型数据库中的表)中文档构造、字段类型、默认值、验证规定等的约束条件。

应用 mongoose.model()办法,能够将一个 JavaScript 对象转换为 Mongoose 的数据模型。

该办法承受两个参数:

  • 第一个参数为模型名称(对应 MongoDB 汇合名称),
  • 第二个参数为模型定义对象。

其中,模型定义对象通常包含以下属性:

  • 字段名:每个字段都能够指定其类型、默认值、验证规定、索引等属性。
  • 静态方法:在数据模型上定义静态方法,可通过模型名称调用。
  • 实例办法:在数据模型原型上定义实例办法,在每个文档对象上都能够调用。
  • 虚构属性:在文档对象中定义虚构属性,它们不会被存储到数据库中,而是由其余字段计算得出。

设计用户模块的 schema

第一步:在我的项目根目录新建 models 文件夹用于存储 models 文件

第二步:在 models 文件夹内新建用户模块的 schema — users.js

须要进行上面步骤:

  1. 导入 mongoose — let mongoose = require('mongoose')
  2. 实例化 Schema — let schema = new mongoose.Schema()
  3. 创立模型对象 — let Users = mongoose.model('users', schema) — 第一个参数为模型名称(对应 MongoDB 汇合名称, 第二个参数为模型定义对象(规定)
  4. 导出模型对象 — module.exports = Users

全副代码

//  导入 mongoose 
let mongoose = require('mongoose')

// 实例化 Schema
const userSchema = new mongoose.Schema({
    username: String,
    pwd: String
})

// 创立模型对象
const User = mongoose.model('users', userSchema)

// 导出模型对象
module.exports = Users

第三步:在路由中应用用户模块的 schema — users.js

var router = require('koa-router')();

const Users = require('../models/users') // 引入 users modal 

router.prefix('/users');

// 增加零碎用户 
router.post('/add', async (ctx) => {let { username, pwd} = ctx.request.body
  await Users.create({username, pwd}).then(rel => {if (rel) {
      ctx.body = {
        code: 200,
        msg: '增加胜利',
        data: rel
      }
    } else {
      ctx.body = {
        code: 300,
        msg: '增加失败'
      }
    }

  }).catch(err => {
    ctx.body = {
      code: 400,
      msg: '增加时出现异常'
    }
    console.error(err)
  })

})

module.exports = router;

在下面的示例代码中,在路由文件 users 中应用const Users = require('../models/users') , 引入 users modal。

增加零碎用户 调用应用 users modal 模块。

其余简单实例

实例一

// userSchema
const mongoose = require('mongoose');

// 创立用户 Schema
const userSchema = new mongoose.Schema({
    username: {
        type: String,
        required: true, // 必填项
        unique: true,   // 惟一索引
        lowercase: true // 存入数据库前将其转换为小写
    },
    password: {
        type: String,
        required: true,
        select: false    // 查问时不返回该字段
    },
    email: {
        type: String,
        required: true,
        match: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
        unique: true
    },
    age: {
        type: Number,
        min: 18,         // 最小值
        max: 60          // 最大值
    },
    created: {
      type: Date,
      default: Date.now
    },
    friends: [{
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User'
    }]
});

// 创立虚构属性
userSchema.virtual('fullName').get(function() {return this.firstName + ' ' + this.lastName;});

// 创立实例办法
userSchema.methods.sayHello = function() {console.log(`Hello, ${this.username}!`);
}

// 创立静态方法
userSchema.statics.findByUsername = function(username, callback) {return this.findOne({ username: username}, callback);
}

// 导出用户 Schema
module.exports = userSchema;

在下面的示例代码中,首先创立了一个用户 Schema 对象,并为其定义了 username、password、email、age、created 和 friends 属性。

每个属性都有其特定的类型和属性,如数据类型、是否必填、最大值最小值、正则表达式等。

而后,通过 virtual 办法创立一个 fullName 虚构属性,以及 methods 办法创立一个 sayHello 实例办法,statics 办法创立一个 findByUsername 静态方法。

最初,将该 Schema 对象导出供其余文件应用。

应用 Schema 对象创立 mongoose 数据模型时,须要在第二个参数传入该 Schema 对象,如下所示:

// models/user
const mongoose = require('mongoose');
const userSchema = require('./userSchema');

const User = mongoose.model('User', userSchema);

module.exports = User;

这样,在其余文件中援用此模型即可,如下所示:

const User = require('./models/user');

const user = new User({
  username: 'admin',
  password: '123456',
  email: 'admin@admin.com',
  age: 27
});

user.save(function(err, doc) {if (err) {console.error(err);
  } else {console.log(doc);
  }
});

实例二

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// 创立用户数据模型
const UserSchema = new Schema({name: { type: String, required: true},
  age: {type: Number, default: 18},
  email: {type: String, required: true},
  password: {type: String, required: true},
  createdAt: {type: Date, default: Date.now}
});

// 创立模型并导出
module.exports = mongoose.model('User', UserSchema);

上述代码中,首先应用 mongoose.Schema()办法定义了一个用户数据模型的构造,并将其存储在 UserSchema 中。

而后应用 mongoose.model()办法,将 UserSchema 转换为一个名为“User”的 model 对象,并导出该对象。

这样,在其余的文件中就能够通过 require()办法来援用该 model 对象,并进行 MongoDB 数据库的操作了。

例如:

const mongoose = require('mongoose');
const User = require('./models/user');

mongoose.connect('mongodb://localhost/test');
const db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {console.log('Connected to MongoDB');

  // 创立一个新用户
  const user = new User({
    name: 'Alice',
    age: 20,
    email: 'alice@example.com',
    password: '123456'
  });

  // 将新用户保留到汇合中
  user.save(function(err, doc) {if (err) return console.error(err);
    console.log(doc);
  });
});

在上述示例代码中,首先应用 mongoose.connect()办法连贯了 MongoDB 数据库,而后应用 require()办法引入了之前定义的 User 模型。

接着创立了一个新用户对象,并调用 save()办法将其保留到数据库中。

每日一课:正则表达式

正则表达式是一个用于匹配文本的模式,能够应用特定的语法规定来示意各种匹配模式。

在 JavaScript 中,能够应用 RegExp 对象 来创立和操作正则表达式。

正则表达式能够用于各种字符串解决工作,例如搜寻、替换、验证等。

上面是一些根本的正则表达式概念:

  • 字符集:用于匹配一组字符中的任何一个字符。例如,[abc]能够匹配 a、b 或 c,还能够应用范畴表示法 [a-z]、1 示意不匹配 a、b 和 c。
  • 元字符:用于示意特殊字符或者非凡的用处。一些常见的元字符包含.、*、+、?、\、|、^、$、(、)等。
  • 量词:用于指定匹配次数。例如,? 示意零次或一次,* 示意零次或屡次,+ 示意一次或屡次,{n}示意恰好匹配 n 次,{n,m}示意匹配 n 到 m 次。
  • 边界匹配符:用于匹配字符串的边界,例如 ^ 示意匹配字符串的结尾,$ 示意匹配字符串的结尾。

上面是一些示例正则表达式及其含意:

  • /a/:匹配字符串中第一个呈现的字符 a。
  • /abc/:匹配字符串中间断呈现的字符串 abc。
  • /\d/:匹配一个数字字符。
  • /\w/:匹配一个字母、数字或下划线字符。
  • /^[a-z]+$/:匹配只蕴含小写字母的字符串。
  • /^\d{3}\-\d{3}\-\d{4}$/:匹配电话号码格局,例如 123-456-7890。

在 JavaScript 中,能够应用 RegExp 对象的构造函数或者字面量语法来创立正则表达式。

例如:

// 通过 RegExp 构造函数创立正则表达式
const pattern1 = new RegExp('ab+c');

// 通过字面量语法创立正则表达式
const pattern2 = /ab+c/;

而后能够应用正则表达式的各种办法,如 test()、exec()等,进行文本匹配和替换操作,

const str = 'Hello, world!';
const pattern = /world/;
console.log(pattern.test(str)); // true
console.log(str.replace(pattern, 'JavaScript')); // Hello, JavaScript!

例如:

const str = 'Hello, world!';
const pattern = /world/;
console.log(pattern.test(str)); // true
console.log(str.replace(pattern, 'JavaScript')); // Hello, JavaScript!

正则表达式是一种弱小的工具,用于解决各种文本匹配、替换、验证等工作。在 JavaScript 中,能够应用 RegExp 对象进行正则表达式操作。

参考文档


  1. abc ↩

正文完
 0