当前位置: 首页 > 工具软件 > CmsWing > 使用案例 >

CmsWing源码分析(三)

盖和洽
2023-12-01

2021SC@SDUSC


此次分析文件src/controller/admin/model.js
该文件中的方法为模型操作,在整个项目中有着举足轻重的地位。

在文件最初,首先引入了path和js模块。
在nodeJs中进行数据查询常常使用到这两个模块。

const path = require('path');
const fs = require('fs');

path模块提供了一些用于处理文件路径的小工具,可以使文件的处理更加简洁。
fs模块则是文件系统模块,负责读写文件。与所有其他JavaScript模块不同的是,fs模块同时提供了同步和异步的方法。同步操作的好处是代码简单,缺点是程序将等待IO操作,在等待时间内,无法响应其它任何事件。而异步读取不用等待IO操作,但代码较麻烦。

一、constructor()

在constructor方法里面,调用父级的constructor方法,并把ctx传递进去。同时,实例化模型类。

constructor(ctx) {
    super(ctx);
    this.db = this.model('cmswing/model');
    this.tactive = 'setup';
  }

Context,即上下文,是 Koa 中处理用户请求中的一个对象,贯穿整个请求生命周期。一般在 middleware、controller、logic 中使用,简称为 ctx。

二、indexAction()

我们使用一个map对象设置数据库查询时的条件: status 为 [’>’, -1] , ismod 为 0 。
countSelect 为分页查询,一般结合page方法一起使用。 data 是 map 限定条件下在数据库中的分页查询结果。data的数据结构包括:pageSize(每页显示的条数),currentPag(当前页),count(总条数),totalPages(总页数),data(当前页下的数据列表)。
pagination 方法对data进行分页展示,存储在html中。
assign 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。第一次 assign 方法将 html 分配给 pagerData ,第二次 assign 方法将 data.data(当前页下的数据列表)分配给 list。

async indexAction() {
    const map = {'status': ['>', -1], 'ismod': 0};
    const data = await this.db.where(map).page(this.get('page')).countSelect();
    const html = this.pagination(data);
    this.assign('pagerData', html); 
    this.assign('list', data.data);
    this.meta_title = '系统模型管理';
    return this.display();
  }

三、addAction()

addAction用于新建模型。
如果请求加载了数据,那么获取post的数据,并设置数据的创建时间和更新时间为当前时间,并把数据状态设置为1。变量res用于确定数据是否成功添加到数据库中:若添加成功,更新缓存;否则告知系统添加模型失败。
如果没有请求加载数据,那么我们设置 active 为 ‘admin/model/index’ ,设置元标题为 ‘添加系统模型’ 。

async addAction() {
    if (this.isPost) {
      const data = this.post();
      data.create_time = new Date().valueOf();
      data.update_time = new Date().valueOf();
      data.status = 1;
      const res = await this.db.add(data);
      if (res) {
        await update_cache('model');
        return this.success({name: '添加成功', url: '/admin/model/index'});
      } else {
        return this.fail('添加模型失败!');
      }
    } else {
      this.active = 'admin/model/index';
      this.meta_title = '添加系统模型';
      return this.display();
    }
  }

四、editAction()

editAction用于编辑模型。

如果请求加载了数据,获取post的数据,并设置数据的更新时间。如果获取的数据 post.attribute_list 为数组,那么将它作为字符串返回,数组中的元素由分隔符“,”分隔。变量res用于确定数据是否成功更新到数据库中,若更新成功,那么更新缓存,告知系统更新模型成功。

如果没有请求加载数据,获取id,并依照id在数据库中查找单条数据,赋值给data。若data的attribute_list不为空,那么我们将 attribute_list 依照“,”分割成字符串数组。
实例化模型 attribute ,查找 model_id = data.id 、字段限制为id,name,title,is_show 的多条数据,并将得到的数据赋值给 fields 。
判断 data 是否继承了其他模型。若继承了其他模型,则获取相应数据赋值给 extend_field ,并将 extend_field 与 fields 合并赋值给 allfields ;否则将 fields 赋值给 allfields 。
使用 JSON.parse() 方法将 data.field_sort 转换为JavaScript对象,并赋值给 field_sort。
最后,将变量 fields,extend_fields,orderbgy,data 中的值分配给模型字段 ‘fields’, ‘extend_fields’, ‘allfields’, ‘info’ ,方法结束并返回。

async editAction() {
    if (this.isPost) {
      const post = this.post();
      post.update_time = new Date().valueOf();
      if (think.isArray(post.attribute_list)) {
        post.attribute_list = post.attribute_list.join(',');
      }

      const res = await this.db.update(post);
      if (res) {
        await update_cache('model');
        return this.success({name: '更新模型成功!', url: '/admin/model/index'});
      }
    } else {
      const id = this.get('id');
      let allfields;
      if (think.isEmpty(id)) {
        this.fail('参数不能为空!');
      }
      const data = await this.db.find(id);
      data.attribute_list = think.isEmpty(data.attribute_list) ? '' : data.attribute_list.split(',');
      const fields = await this.model('attribute').where({model_id: data.id}).field('id,name,title,is_show').select();
      if (data.extend != 0) {
        var extend_fields = await this.model('attribute').where({model_id: data.extend}).field('id,name,title,is_show').select();
        allfields = fields.concat(extend_fields);
      } else {
        allfields = fields;
      }
      for (const field of allfields) {
        if (!think.isEmpty(data.attribute_list) && !in_array(field.id, data.attribute_list)) {
          field.is_show = 0;
        }
      }
      var obj = {};
      if (allfields) {
        for (const v of allfields) {
          obj[v.id] = v;
        }
      } else {
        for (const v of fields) {
          obj[v.id] = v;
        }
      }
      const field_sort = JSON.parse(data.field_sort);
      if (!think.isEmpty(field_sort)) {
        for (const group in field_sort) {

          field_sort[group].forEach((v, k) => {
            if (obj[v]) {
              obj[v].group = group;
              obj[v].sort = k;
            }
          });
        }
      }
      console.log(obj);
      const order = think._.values(obj);
      const orderbgy = think._.orderBy(order, ['group', 'sort'], ['asc', 'asc']);

      this.assign({'fields': fields, 'extend_fields': extend_fields, 'allfields': orderbgy, 'info': data});
      this.active = 'admin/model/index';
      this.meta_title = '编辑模型';
      return this.display();
    }
  }
 类似资料: