热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Vue+Koa前后端分离项目实战】使用开源框架==>快速搭建后台管理系统part2后端新增期刊功能实现

喧闹任其喧闹,自由我自为之。我自风情万种,与世无争。别人对你的打分,是他对你的看法他不了解你的时候,你又何必在乎她的打分呢!你给自己打几分?

喧闹任其喧闹,自由我自为之。我自风情万种,与世无争。

别人对你的打分,是他对你的看法他不了解你的时候,你又何必在乎她的打分呢!你给自己打几分?

上一节,我们搭建了项目,并且完成了项目搭建,【Vue + Koa 前后端分离项目实战】使用开源框架==>快速搭建后台管理系统 -- part1 项目搭建_小白Rachel的博客-CSDN博客

这节我们从后端入手,开始项目代码学习。从后端入手,完成【新增期刊】功能

项目最终实现效果:qinchenju.com/island

本节实现效果速览:


 ​​​​​​​目录

一、准备工作

1.功能开发的顺序?

2.代码写在哪里?

(1)项目目录结构

(2)代码规范

(3)数据库模型规范

二、接口开发初体验

1.测试接口编写

2.使用postman工具测试接口

三、【正式开始】接口实现业务逻辑

1.参数校验--校验器

2.执行业务逻辑

(1)新增服务层Service文件

(2)新建模型层Model文件

(3)新增Dao层文件

(4)完整实现Service逻辑

3.完整实现api逻辑


一、准备工作

使用IDE工具打开后端代码lin-cms-koa

koa 是一个优美的微框架,【林间有风】团队自己整理出了开发规范。

1.功能开发的顺序?

先开发后端接口--->再写前端代码-->前后端联调

2.代码写在哪里?

项目文档地址:项目结构及开发规范 | Lin CMS

(1)项目目录结构

(2)代码规范

  • 在 app/api 文件夹中开发 API,并将不同版本,不同类型的 API 分开,如:v1 代表 第一版本的 API,v2 代表第二版本,cms 代表属于 cms 的 API。
  • 将程序的配置文件放在 app/config 文件夹下,并着重区分 secure(安全性配置) 和 setting(普通性配置)。配置更详细内容参考配置
  • 将可重用的类库放在 app/lib 文件夹下。
  • 将数据模型放在 app/model 文件夹下。
  • 将开发的插件放在 app/plugin 文件夹下。
  • 将校验类放在 app/validator 文件夹下。

(3)数据库模型规范

koa 本身并非对数据库做出支持,Lin 通过集成sequelize这个orm 库来进行数据访问, 如果你不熟悉,请先阅读官方文档

中文文档: GitHub - demopark/sequelize-docs-Zh-CN at v5

二、接口开发初体验

1.测试接口编写

在app-->api-->v1目录下新建 content.js文件

(1)实例化接口对象

说明:LinRouter()这个类是对KoaRouter的封装,让他的功能更加强大,同时兼容KoaRouter的所有操作

(2)配置路由前缀

(3)定义方法并返回测试数据

// 文件 app/api/v1/content.js
import { LinRouter } from 'lin-mizar'
const cOntentApi= new LinRouter({
prefix: '/v1/content' // 配置路由前缀
})
// 定义方法
contentApi.post('/', async ctx => {
const test = {
res: true
}
return ctx.json(test) // 返回测试信息
})
module.exports = { contentApi } // 导出

2.使用postman工具测试接口

使用node index.js启动项目

由于前端项目还没有实现,之能通过接口测试工具,如postman进行测试

可以看到输入信息,证明接口现在已经跑通了。 

三、【正式开始】接口实现业务逻辑

一般写新增接口的业务逻辑:

  1. 参数校验
  2. 执行业务逻辑
  3. 插入数据库
  4. 返回成功

1.参数校验--校验器

lin-cms已经内置了参数校验的类库

按照目录规范: 在app-->validators 新建content.js 保持同名

声明 AddContentValidator()类,继承了LinValidator()验证器基类

lin-cms是基于validator.js库实现的。因此validator.js中的原生校验也可以在此使用。

// 文件 app/validator/content.js
import { config, LinValidator } from 'lin-mizar'
import { Rule } from 'lin-mizar/lin'
class AddContentValidator extends LinValidator {
constructor () {
super();
this.image = [
new Rule('isNotEmpty', '内容封面不能为空')
]
this.type = [
new Rule('isNotEmpty', '内容类型不能为空'),
new Rule('isInt', '内容类型id必须是数字')
]
this.title = [
new Rule('isNotEmpty', '内容标题不能为空')
]
this.cOntent= [
new Rule('isNotEmpty', '内容介绍不能为空')
]
this.url = [
new Rule('isOptional'),
new Rule('isURL', '内容外链必须是合法url地址')
]
this.pubdata = [
new Rule('isNotEmpty', '发布不能为空'),
new Rule('isISO8601', '发布日期格式不正确')
]
this.status = [
new Rule('isNotEmpty', '内容有效状态未指定'),
new Rule('isInt', '内容有效状态标识不正确')
]
}
}
export { AddContentValidator }

在content中添加如下,进行测试。

// app/api/v1/content.js
// 1.参数校验
const v = await new AddContentValidator().validate(ctx)
return ctx.json(v)

修改完成之后,重启框架。到postman测试

由于没有传参 因此所有的校验都报错。传入一些信息之后,可以校验。

 

如果想要获取到返回数据,只需要 修改 return ctx.json(v.get('body'))  重启框架,输入正确的信息,可以看到数据已经全部返回。

 

2.执行业务逻辑

由于movie music sentence三者主要字段相同,但是music多了一个url字段

因此,每次添加之前,需要判断数据是三者之中的哪一类,然后再插入数据库中。

(1)新增服务层Service文件

在app目录下新建service文件,表示服务层文件。并添加centent.js文件。

在类中定义添加期刊的方法addContent,其参数是前端传入的表单。

在switch中判断type字段(100-电影 200-音乐 300-句子)插入到表中

import { MovieDao } from '../dao/movie';
import { MusicDao } from '../dao/music';
import { SentenceDao } from '../dao/sentence';
import { NotFound } from 'lin-mizar';
class Content {
static async addContent (v) {
// 根据不同种类判断数据
switch (v['type']) {
case 100:
// 电影
// delete v['url']
// await MovieDao.addMovice(v);
break;
case 200:
// 音乐
/// await MusicDao.addMusic(v);
break;
case 300:
// 句子
// delete v['url']
// await SentenceDao.addSentence(v);
break;
default:
throw new NotFound({ msg: '内容类型不存在' });
}
}
}
export { Content as ContentService };

问题来了:如何插入数据到数据库中?

回答:数据库模型orm库

(2)新建模型层Model文件

在app-->model中新增三个模型文件movie.js music.js sentence.js

每一个模型对应一张表。

import { Sequelize, Model } from 'sequelize';
import sequelize from '../libs/db';
import { config } from 'lin-mizar';
class Movie extends Model {
}
Movie.init (
{
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
image: {
type: Sequelize.STRING(64)
},
content: {
type: Sequelize.STRING(300),
allowNull: true
},
pubdate: {
type: Sequelize.INTEGER,
allowNull: true
},
fav_nums: {
type: Sequelize.INTEGER,
defaultValue: 0
},
title: {
type: Sequelize.STRING(50)
},
type: {
type: Sequelize.INTEGER
},
status: {
type: Sequelize.INTEGER
}
},
{
// 定义表名
tableName: 'movie',
// 定义模型名
modelName: 'movie',
// 删除
paranoid: true,
// 自动写入时间
timestamps: true,
// 重命名时间字段
createdAt: 'created_at',
updatedAt: 'updated_at',
deletedAt: 'deleted_at',
sequelize
}
)
export { Movie as MovieModel }

定义了一个类,继承Model基类 。并配置属性,是关系的映射。

(3)新增Dao层文件

在Dao文件夹下新建三个js文件 movie.js  music.js  sentence.js 分别对应三个模型

思路:在Dao层中调用模型层

import { MovieModel } from '../models/movie';
// 在Dao层中调用模型层
class Movie {
static async addMovice (v) {
return await MovieModel.create(v)
}
}
export { Movie as MovieDao }

(4)完整实现Service逻辑

 在service层中,可以调用Dao层数据

service层中的content.js 完成整个添加逻辑

由于电影和句子没有url字段,因此去掉即可

import { MovieDao } from '../dao/movie';
import { MusicDao } from '../dao/music';
import { SentenceDao } from '../dao/sentence';
import { NotFound } from 'lin-mizar';
class Content {
static async addContent (v) {
// 根据不同种类判断数据
switch (v['type']) {
case 100:
// 电影
delete v['url']
await MovieDao.addMovice(v);
break;
case 200:
// 音乐
await MusicDao.addMusic(v);
break;
case 300:
// 句子
delete v['url']
await SentenceDao.addSentence(v);
break;
default:
throw new NotFound({ msg: '内容类型不存在' });
}
}
}
export { Content as ContentService };

3.完整实现api逻辑

回到api文件中,完善content.js

contentApi.post('/', async ctx => {
// 1.参数校验
const v = await new AddContentValidator().validate(ctx)
// return ctx.json(v.get('body'))
// 2.执行业务逻辑
// 3.插入数据库-封装在service层
await ContentService.addContent(v.get('body'))
// 4.返回成功
ctx.success({
msg: '期刊内容新增成功'
})
})

在postman中,模拟数据调用,调用完成之后,直接查看数据库,即可看到新增数据。切换类型,可以测试其他类型的数据新增情况。

至此,我们本节完成了一次新增方法的后端逻辑

​​​​​​​

 

问题:每次查看都需要在数据库中查阅数据新增情况,有些麻烦。

因此下一节,我们将 实现 【期刊列表查询】功能


版权声明:本文为Sabrina_cc原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Sabrina_cc/article/details/126481312
推荐阅读
  • vue使用
    关键词: ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
author-avatar
mobiledu2502887333
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有