CmsWing源码分析(八)

本文档介绍了JavaScript文件中三个核心方法:upattr()用于属性的新增或更新,checkTableExist()检查指定模型表是否存在,addtable()初始化独立模型表结构。方法详细阐述了参数、逻辑及数据库交互过程,涉及数据操作与表管理。
摘要由CSDN通过智能技术生成

2021SC@SDUSC


此次分析文件src/model/csmwing/attribute.js
该文件中的方法主要是对表的处理。

一、upattr()

此方法用于新增或更新一个属性。
此方法有两个参数:第一个参数 data 为需要进行操作的属性; 第二个参数 create 是一个布尔类型的值,create 为 true 表示需要对属性的内容进行操作,create 为 false 表示仅更新属性的更新时间。
首先获取数据对象。若 data 为空,方法无法执行,返回 false。
判断 data.id 是否为空。若为 data.id 空,表示该属性为新增属性,将属性建立时间设为当前时间,属性状态设为1,把属性添加进去并获取到属性 id 。 若 id 不为正,表示属性添加失败,方法返回布尔值 false。若 create 不为 true,方法执行成功,方法结束;若 create 为 true,在表中新增该属性,并获取方法 addField() 的返回值,赋值给 res 。若 res 为 false ,表示添加失败,删除属性的 id ,方法返回布尔值 false,方法结束。若 res 为 true,方法执行成功,方法结束。
若 data.id 不为空,表示该属性为需要更新的属性。若 create 不为 true ,更新属性的更新时间,方法结束。若 create 为 true ,更新表字段,然后更新属性的更新时间,方法结束。

async upattr(data, create) {
    if (think.isEmpty(data)) {
      return false;
    }

    if (think.isEmpty(data.id)) { 
      data.create_time = new Date().valueOf();
      data.status = 1;
      const id = await this.add(data);
      if (!id) {
        return false;
      }
      if (create) {
        const res = await this.addField(data);
        console.log(res);
        // return false;
        if (!res) {
          this.delete(id);
          return false;
        }
      }
    } else {
      if (create) {
        const res = await this.updateField(data);
      }
      data.update_time = new Date().valueOf();
      const status = await this.update(data);
    }
    return data;
  }

二、checkTableExist()

此方法用于检查当前表是否存在。
此方法仅有一个参数 model_id ,为模型id。
首先实例化 model。在数据库中查找 id 为 model_id 、属性包括 name 和 extend 的单条数据,赋值给 model。
依据 model.extend 的值判断模型是否为独立模型,从而获取模型表名 table_name 。
在数据库 mysql 中查找名字为 table_name 的表,赋值给 res 。res 的 length 即为表的数量。由于建表时我们会对表的名字进行查重处理,换言之不会出现两个名字相同而内容不同的表,而所以res 的 length 为 0 时表示表不存在,不为 0 时表示表存在。

async checkTableExist(model_id) {
    let table_name;
    let extend_model;
    const Model = this.model('model');
    const model = await Model.where({id: model_id}).field('name,extend').find();
    if (model.extend == 0) { 
      table_name = this.table_name = think.config('model.mysql.prefix') + model.name.toLowerCase();
    } else {
      extend_model = await Model.where({id: model.extend}).field('name,extend').find();
      table_name = this.table_name = think.config('model.mysql.prefix') + extend_model.name.toLowerCase() + '_' + model.name.toLowerCase();
    }
    const res = await this.model('mysql').query(`SHOW TABLES LIKE '${table_name}'`);
    return res.length;
  }

三、addtable()

此方法用于初始化独立模型表结构。
此方法仅有一个参数 mod_id ,为模型id。

async addtable(mod_id) {
    const table_exist = await this.checkTableExist(mod_id);
    let sql;
    if (!table_exist) {
      const model_info = await this.model('model').where({id: mod_id}).field('engine_type,need_pk').find();
      console.log(model_info);
      if (model_info.need_pk) {
        sql = ` CREATE TABLE IF NOT EXISTS \`${this.table_name}\` (
                \`id\`  int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键' ,
                \`title\` char(80) NOT NULL COMMENT '标题',
                \`category_id\` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '栏目目录',
                \`group_id\` smallint(3) unsigned NOT NULL DEFAULT '0' COMMENT '所属分组',
                \`model_id\` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '内容模型ID',
                \`create_time\` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
                \`update_time\` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
                \`status\` tinyint(4) NOT NULL DEFAULT '0' COMMENT '数据状态0禁用,1启用,-1删除',
                \`sort_id\` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '分类信息关联id',
                PRIMARY KEY (\`id\`),
                KEY \`category_id\` (\`category_id\`),
                KEY \`group_id\` (\`group_id\`),
                KEY \`status\` (\`status\`),
                KEY \`sort_id\` (\`sort_id\`)
                )
                ENGINE=${model_info.engine_type}
                DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
                CHECKSUM=0
                ROW_FORMAT=DYNAMIC
                DELAY_KEY_WRITE=0
                ;`;
        sql = this.parseSql(sql);
      } else {
        sql = ` CREATE TABLE IF NOT EXISTS \`${this.table_name}\` (
                \`title\` char(80) NOT NULL COMMENT '标题',
                \`category_id\` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '栏目目录',
                \`group_id\` smallint(3) unsigned NOT NULL DEFAULT '0' COMMENT '所属分组',
                \`model_id\` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '内容模型ID',
                \`create_time\` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
                \`update_time\` bigint(13) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
                \`status\` tinyint(4) NOT NULL DEFAULT '0' COMMENT '数据状态0禁用,1启用,-1删除',
                \`sort_id\` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '分类信息关联id',
                KEY \`category_id\` (\`category_id\`),
                KEY \`group_id\` (\`group_id\`),
                KEY \`status\` (\`status\`),
                KEY \`sort_id\` (\`sort_id\`)
                )
                ENGINE=${model_info.engine_type}
                DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
                CHECKSUM=0
                ROW_FORMAT=DYNAMIC
                DELAY_KEY_WRITE=0
                ;`;
        sql = this.parseSql(sql);
      }
      const res = await this.model('mysql').execute(sql);
      return res >= 0;
    }else{
      return 0;
    }
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值