前端项目后端服务开发
1、src/config.js数据库配置
定义数据库配置之后就可操作数据库了。
export const config = {
database: '',
username: '',
password: '',
host: '',
port:
}
2、src/db/config.js连接到数据库
sequelize实例化,实例化后就会以连接池的形式连接到所使用的数据库。
传入的参数有数据库名称、用户名、密码。以及一个参数对象,分别是连接数据库的主机、端口、数据库类型(‘mysql’)、日志打印、过期时间。
import sequelize from 'sequelize';
import { config } from '../config';
export const dbInstance = new sequelize.Sequelize(
config.database,
config.username,
config.password,
{
host: config.host,
port: config.port,
dialect: 'mysql',
logging: true,
timeout: 10000
}
);
3、src/model/project.js定义数据模型
这里dbInstance.define是用了sequelize.define() - 模型定义的实例方法,这个实例方法用于定义一个新Model(模型)。Model相当于数据库中的表,该对象不能通过构造函数实例化,而只能通过sequelize.define()或sequelize.import()方法创建。
这里有三个参数,分别是数据库表名、表中的字段(projectAttrs 里面的每一个属性代表数据库中的每一个字段)、选项参数(const options = {
paranoid: true,
underscored: true
})。
Object.assign(target, …sources) 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
import sequelize from 'sequelize';
import { dbInstance } from '../db/config.js';
import { attributes, options } from '../shared/sequelize.js';
import Page from './page.js';
const projectAttrs = Object.assign({
desc: {
type: sequelize.DataTypes.TEXT,
allowNull: false
},
coverUrl: {
type: sequelize.DataTypes.STRING,
allowNull: false
}
}, attributes);
const Project = dbInstance.define('project', projectAttrs, options);
Project.hasMany(Page);
export default Project;
4、 src/controllers/project.js使用sequelize.js来操作数据库
先来看简单的吧
写了4个异步操作,分别是查询数据、添加数据、更新数据、删除数据。
- 查询数据:bases(),返回表中的所有数据。
- 添加数据:createBases(payload),参数payload指的是插入的一组数据。调用了sequelize.create()方法,返回插入数据的id、
- 更新数据:updateBase(id, payload),参数id找到该条数据,payload是要更新的数据。调用sequelize.update()方法。
- 删除数据:deleteBase(id).调用sequelize.destroy()方法,找到id.然后删除。
import {Base} from '../model/base.js';
//用异步语句写了 一个表控制 类
export class BaseController {
async bases() {
return Base.findAll(); //返回一组Model(数据模型)实例。
}
async createBase(payload) {
const newBase = await Base.create({ //往表中插入数据, newBase是一个对象,包含新插入的信息
name: payload.name,
desc: payload.desc,
});
return newBase.id; //返回 id
}
async updateBase(id, payload) {
await Base.update( //更新表。
{
name: payload.name,
desc: payload.desc
},
{
where: {
id
}
}
);
}
async deleteBase(id) {
await Base.destroy({ //删除
where: {
id
}
});
}
}
import Project from '../model/project.js';
import Page from '../model/page.js';
const attributes = {
exclude: ['deletedAt', 'updatedAt']
}
export default class ProjectController {
projects() {
return Project.findAll({ attributes });
}
project(id) {
return Project.findByPk(
id,
{
attributes,
include: [{
model: Page
}]
});
}
async createProject(payload) {
const project = await Project.create({
name: payload.name,
desc: payload.desc,
coverUrl: payload.coverUrl
});
return project.id;
}
async updateProject(id, payload) {
await Project.update(
{
name: payload.name,
desc: payload.desc,
coverUrl: payload.coverUrl
},
{
where: {
id
}
}
);
}
async deleteProject(id) {
await Project.destroy({
where: {
id
}
});
}
}
5、 src/routes/base.js设置路由,不同的请求执行不同的操作。
这里使用的koa-router库。koa路由中间件。
定义baseRoute 其路径为/api/base
定义了4个请求操作,分别是get、post、put、delete。
post和put的区别是:新建一条记录的话就用post,更新一条记录的话就用put。
- get请求。baseRoute.get(),里面两个参数,一个参数是路径,一个是异步函数。路径就是根路径,执行的函数是 获得控制器查询获得的数据,然后页面展示的body是数据和那个ok。
- post请求。baseRoute.post(),第二个参数里,定义的payload是ctx里的body部分,也就是post请求时带的数据。控制器添加数据(payload)返回id,然后页面展示个id。
- put请求。baseRoute.put(),获得params里面的id 是在路径中的。如果这个id不存在的话,就输出错误信息;否则调用更新表方法,找到id更新payload。
- delete请求。baseRoute.delete()获得id就可以直接删除了。
import KoaRouter from 'koa-router';
import {BaseController} from '../controllers/base.js';
const baseRoute = new KoaRouter({
prefix: '/api/base'
});
baseRoute.get('/', async function (ctx) {
const data = await new BaseController().bases();
ctx.body = {
data,
message: 'ok'
};
});
baseRoute.post('/', async function(ctx) {
const payload = ctx.request.body;
const id = await new BaseController().createBase(payload);
ctx.body = {
data: id,
message: 'ok'
};
});
baseRoute.put('/:id', async function(ctx) {
const id = Number(ctx.params.id);
const payload = ctx.request.body;
if (isNaN(id)) {
ctx.statusCode = 400;
ctx.body = {
message: 'id must be number',
};
} else {
await new BaseController().updateBase(id, payload);
ctx.body = {
message: 'ok'
}
}
});
baseRoute.delete('/:id', async function(ctx) {
const id = Number(ctx.params.id);
if (isNaN(id)) {
ctx.statusCode = 400;
ctx.body = {
message: 'id must be number',
};
} else {
await new BaseController().deleteBase(id);
ctx.body = {
message: 'ok'
}
}
});
export {
baseRoute
}
这里的project路由和base路由用混了。