【Vue + Koa 前后端分离项目实战5】使用开源框架==>快速搭建后台管理系统 -- part5 后端实现最新期刊列表管理【增删查改】

“我们领教了世界是何等凶顽,同时又得知,世界也可以变得温存和美好。”

愿你我皆心存善意,遇到的,都是善良的人。

上节回顾:【Vue + Koa 前后端分离项目实战4】使用开源框架==>快速搭建后台管理系统 -- part4 后端实现【增删改查】功能_小白Rachel的博客-CSDN博客

本章主要讲解:最新期刊列表管理模块的增删查改功能,是上一节的强化。 


目录

一、最新期刊内容新增

1.自定义参数校验器

2.在model层定义字段信息

3.在dao层编写新增逻辑

4.在接口层完成逻辑

5.在测试工具上测试

二、(重点)最新期刊列表

1.在dao层定义查询列表函数

2.在service层处理数据格式

3.在接口层视图函数处理参数

4.使用测试工具测试

三、(重点)编辑最新期刊列表

 1.自定义校验器

2.在dao层定义修改逻辑

3.在接口层获取对应字段

4.接口测试工具测试

 四、删除最新期刊

 1.自定义校验器

2.在dao层操作数据库

3.在接口层传参并操作

4.接口测试工具测试

五、后端部分结束

往期回顾


一、最新期刊内容新增

类比期刊新增功能,首先在相应的目录下建立文件夹,并ctrl+CV关键重复信息 

1.自定义参数校验器

validator/flow.js
class AddFlowValidator extends LinValidator {
  constructor () {
    super();
    this.index = [
      new Rule('isNotEmpty', '必须指定新增期刊内容排序'),
      new Rule('isInt', '期刊内容序号必须是数字且大于0', { min: 1 })
    ]
    this.type = [
      new Rule('isNotEmpty', '内容类型不能为空'),
      new Rule('isInt', '内容类型id必须是数字')
    ]
    this.art_id = [
      new Rule('isNotEmpty', '期刊内容id不能为空'),
      new Rule('isInt', '内容类型id必须是数字')
    ]
    this.status = [
      new Rule('isNotEmpty', '内容有效状态未指定'),
      new Rule('isInt', '内容有效状态标识不正确')
    ]
  }
}

2.在model层定义字段信息

import { Sequelize, Model } from 'sequelize';
import sequelize from '../libs/db';

class Flow extends Model {

}

Flow.init (
  {
    id: {
      type: Sequelize.INTEGER,
      primaryKey: true,
      autoIncrement: true
    },
    index: {
      type: Sequelize.INTEGER,
      allowNull: true,
    },
    type: {
      type: Sequelize.INTEGER,
      allowNull: true,
    },
    art_id: {
      type: Sequelize.INTEGER,
      allowNull: true,
    },
    status: {
      type: Sequelize.INTEGER
    }
  },
  {
    tableName: 'flow',
    modelName: 'flow',
    paranoid: true,
    underscored: true,
    timestamps: true,
    createdAt: 'created_at',
    updatedAt: 'updated_at',
    deletedAt: 'deleted_at',
    sequelize
  }
)

export { Flow as FlowModel }

3.在dao层编写新增逻辑

import { FlowModel } from '../models/flow';

// 在Dao层中调用模型层
class Flow {
  static async createFlow (v) {
    const res = await FlowModel.create({
      index: v.get('body.index'),
      type: v.get('body.type'),
      art_id: v.get('body.art_id'),
      status: v.get('body.status')
    })
    return res
  }
}

export { Flow as FlowDao }

4.在接口层完成逻辑

import { LinRouter } from "lin-mizar";
import { groupRequired } from "../../middleware/jwt";
import { logger } from "../../middleware/logger";
import { AddFlowValidator } from '../../validators/flow';
import { FlowDao } from '../../dao/flow';

const flowApi = new LinRouter({
  prefix: "/v1/flow", // 配置路由前缀
});

/**
 * 新增期刊内容
 */
flowApi.linPost(
  "addFlow", // 函数唯一标识
  "/",
  {
    permission: "新增最新期刊", // 权限名称
    module: "最新期刊管理", // 权限所属模块
    mount: true,
  },
  groupRequired, // 权限级别
  logger("{user.username}新增了最新期刊内容"),
  async (ctx) => {
    // 1.参数校验
    const v = await new AddFlowValidator().validate(ctx);
    // 2.执行业务逻辑
    // 3.插入数据库-直接在dao层(省去service层)
    await FlowDao.createFlow(v)
    // 4.返回成功
    ctx.success({
      msg: "期刊内容新增成功",
    });
  }
);

module.exports = { flowApi };

5.在测试工具上测试

接口:post   http://localhost:5000/v1/flow

在数据库中最新期刊的数据库表是flow,主要用于存储期刊id(art_id),期刊类型(type)状态(status)等字段。

二、(重点)最新期刊列表

功能说明:进入页面展示最新期刊数据,主要包含:序号、内容标题、内容类型、内容介绍、排序、是否展示。

api/v1/flow.js  接口实现思路:

(1)查询flow表 (从数据库中查询flow表的信息,返回结果列表并按照index字段排序)

(2)根据结果里面的art_id、type字段查询对应类型期刊  (flow表格中只有期刊id和type并没有详情信息,因此需要再次查询期刊详情数据并拼接到结果数据中)

(3)对于查询的数据格式化

(4)返回数据

1.在dao层定义查询列表函数

定义查询方法getFLowList()   获取flow表的数据,并按照index排序结果 

// dao/flow.js
static async getFlowList () {
    // 查询并按照index字段排序
    return await FlowModel.findAll({
      order: ['index']
    })
  }

2.在service层处理数据格式

定义getFlowList() 方法。

逻辑:(1)首先获取flow表格中的数据flowList

(2)对于不为空的列表数据,循环拼凑detail数据。根据结果里面的art_id、type两个字段查询对应类型期刊详情数据(findByPk(flowList[i].art_id))。 并得到最后的结果newFlowList

// service/flow.js
class Flow {
  static async getFlowList () {
    const flowList = await FlowDao.getFlowList()
    // 判断数组长度是否为0,为零直接返回
    if (flowList.length === 0) {
      return flowList
    }
    const newFlowList = []
    for (let i = 0; i < flowList.length; i++) {
      let detail
      // 根据类型判断
      switch (flowList[i].type) {
        case 100:
          detail = await MovieModel.findByPk(flowList[i].art_id)
          break
        case 200:
          detail = await MusicModel.findByPk(flowList[i].art_id)
          break
        case 300:
          detail = await SentenceModel.findByPk(flowList[i].art_id)
          break
      }
      // 将detail详情数据添加到每一条记录中
      flowList[i].setDataValue('detail', detail)
      newFlowList.push(flowList[i])
    }
    return newFlowList
  }
}

3.在接口层视图函数处理参数

// api/v1/flow.js
flowApi.get('/', async ctx => {
  // 1.查询flow表
  // 2.根据结果里面的art_id、type字段查询对应类型期刊
  // 3.对于查询的数据格式化
  // 4.返回数据
  const flowList = await FlowService.getFlowList()
  ctx.json(flowList)
})

4.使用测试工具测试

get方法 http://localhost:5000/v1/flow

三、(重点)编辑最新期刊列表

 功能描述:点击列表的”编辑“按钮,弹框展示期刊详情。可以修改:排序、期刊内容、是否展示。修改完成之后,点胶机”保存“按钮,保存修改。

 1.自定义校验器

// validator/flow.js
class EditFlowValidator extends AddFlowValidator {  // 继承add校验器
  constructor () {
    super();
    this.id = [
      new Rule('isNotEmpty', '最新期刊id不能为空'),
      new Rule('isInt', '最新期刊id必须是数字且大于0', { min: 1 })
    ]
  }
}

2.在dao层定义修改逻辑

定义editFlow (id, index, type, art_id, status)方法,需要传入5个参数.其中id用于查询出修改的数据,其余字段用于修改。

// dao/flow.js
static async editFlow (id, index, type, art_id, status) {
    // 查询到需要修改的数据
    const flow = await FlowModel.findByPk(id)
    if (!flow) {
      throw new NotFound()
    }
    // 修改前端传入的全部数据 相同的覆盖 不同的修改
    await flow.update({ index, type, art_id, status })
  }

3.在接口层获取对应字段

定义put接口,并依次按照接口传参获取数据,并调用dao层方法。

flowApi.linPut(
  'editFlow',
  '/:id',
  {
    permission: "编辑最新期刊", // 权限
    module: "最新期刊管理",
    mount: true
  },
  groupRequired, // 权限级别
  logger("{user.username}编辑了最新期刊"),
  async ctx => {
    // 校验数据
    const v = await new EditFlowValidator().validate(ctx)
    // 没有过多业务逻辑-直接调用dao层
    // 在请求接口中获取id
    const id = v.get('path.id')
    // 请求体中获取index type art_id status
    const index = v.get('body.index')
    const type = v.get('body.type')
    const art_id = v.get('body.art_id')
    const status = v.get('body.status')
    await FlowDao.editFlow(id, index, type, art_id, status)  // 使用dao层方法
    ctx.success({
      msg: '最新期刊编辑成功'
    })
  })

4.接口测试工具测试

put 请求 http://localhost:5000/v1/flow/1

示例:修改排序号index 1-->10

 四、删除最新期刊

功能说明:删除最新期刊只是解除了【当前期刊是最新期刊】并没有删除其在数据库中的记录,相应的期刊列表还是有数据的。相当于一个【发布/取消发布】

 1.自定义校验器

老生常谈

class DeleteFLowValidator extends LinValidator {
  constructor () {
    super();
    this.id = [
      new Rule('isNotEmpty', '最新期刊id不能为空'),
      new Rule('isInt', '最新期刊id必须是数字且大于0', { min: 1 })
    ]
  }
}

2.在dao层操作数据库

根据id删除记录

static async deleteFlow (id) {
    // 根据id获取数据
    const flow = await FlowModel.findByPk(id)
    if (!flow) {
      throw new NotFound()
    }
    // 删除
    await flow.destroy()
  }

3.在接口层传参并操作

flowApi.linDelete(
  "deleteFlow",
  "/:id",
  {
    permission: "删除最新期刊", // 权限
    module: "最新期刊管理",
    mount: true
  },
  groupRequired, // 权限级别
  logger("{user.username}删除了最新期刊"),
  async (ctx) => {
    // 校验前端传入的id
    const v = await new DeleteFLowValidator().validate(ctx)
    await FlowDao.deleteFlow(v.get('path.id'))
    ctx.success({
      msg: "最新期刊删除成功",
    });
  }
);

4.接口测试工具测试

delete方法  http://localhost:5000/v1/flow/1

五、后端部分结束

至此,经过前面四节,所有的后端部分都已实现完成,接下开的小节将展示前端部分。

潜在优化点:在service层,反复使用到了switch语言三次,此处可以优化。

官方文档:http://doc.cms.talelin.com/


往期回顾

第一节我们简单介绍了林间有风框架

第二到第五节:展开讲解后端部分【期刊列表】【最新期刊】的增删查改功能

第六到第七节:展开讲解前端功能实现

【Vue + Koa 前后端分离项目实战】使用开源框架==>快速搭建后台管理系统 -- part1 项目搭建_小白Rachel的博客-CSDN博客_vue+koa

【Vue + Koa 前后端分离项目实战2】使用开源框架==>快速搭建后台管理系统 -- part2 后端新增期刊功能实现_小白Rachel的博客-CSDN博客_koa 开源项目

【Vue + Koa 前后端分离项目实战3】使用开源框架==>快速搭建后台管理系统 -- part3 权限控制+行为日志_小白Rachel的博客-CSDN博客

https://blog.csdn.net/Sabrina_cc/article/details/127732328【Vue + Koa 前后端分离项目实战4】使用开源框架==>快速搭建后台管理系统 -- part4 后端实现【增删改查】功能_小白Rachel的博客-CSDN博客

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python+Vue+Django前后端分离项目实战,涉及到使用Python语言编写后端服务,使用Vue框架构建前端界面,并通过Django框架作为API接口实现后端数据交互的方式。在实战项目中也会涉及到数据库设计和调用、权限控制、文件上传等问题的解决。 ### 回答2: Python、Vue和Django是现在非常流行的前后端开发技术。如果你想学习这些技术,那么前后端分离是一个很好的选择。在这个项目中使用Python作为后端编程语言,Django作为Web框架Vue作为前端框架。我们可以在这个项目中学习到很多关于前后端分离的经验。 首先,前后端分离可以让我们更好地组织我们的代码。在一个分离的项目中,我们可以通过明确的接口来分离前端后端。这样一来,我们可以专注于开发代码,而不必担心前后端之间的交互问题。 其次,前后端分离可以使我们更好地实现可重用性。在这个项目中,我们可以编写可重用的Vue组件,并在不同的前端页面中使用它们。同样地,我们也可以编写可重用的Django应用程序,并在不同的后端端点中使用它们。这会使我们的代码更加清晰简洁,也可以提高我们的开发效率。 最后,前后端分离可以让我们更好地实现可维护性。在一个分离的项目中,我们可以更轻松地进行单元测试和端到端测试。这可以帮助我们保持代码的质量,并尽早发现和解决潜在的问题。 总之,Python、Vue和Django前后端分离项目是一个非常好的学习项目。通过这个项目,我们可以从实践中学习如何使用这些技术,并在以后的项目中更好地应用它们。 ### 回答3: Python、Vue和Django是目前非常流行的技术栈之一,其中Python和Django主要用于后端开发,Vue则是一款流行的前端框架。Python和Django的优点在于它们易于学习、可扩展性强、社区活跃,并且可以用于构建各种类型的Web应用程序。而Vue的优点在于它简洁、高效、组件化,并且可以很好地配合其他框架和库使用前后端分离是一种可以将前端后端分别开发的方法,这种方法具有很多优点。首先,可以使开发人员更加专注于各自的领域,减少互相干扰和影响。其次,这种方法可以提高应用程序的可维护性和可扩展性。最后,这种方法还可以提高开发效率,使开发人员能够更加高效地开发应用程序。 在前后端分离项目实战中,需要注意以下几点。首先,需要确定应用程序的需求,确定前端后端的接口规范。其次,需要使用合适的工具和框架来完成前后端的开发任务。对于后端开发,可以使用Django的REST框架,这个框架可以很快地构建RESTful API,并且配合数据库使用。而对于前端开发,则可以使用Vue框架来开发,Vue可以很好地处理数据和UI逻辑。最后,需要着重测试和调试应用程序,确保应用程序的正确性和可用性。 总的来说,Python、Vue和Django是一组非常流行的技术栈,非常适合用于前后端分离项目的开发。在开发前需要确定好需求,选择好工具和框架,开发期间需要注重测试和调试,这样才能开发出高质量的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白Rachel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值