CmsWing源码分析(九)

2021SC@SDUSC

目录


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

一、addField()

此方法用于新建表字段。
此方法只有一个参数,类型为 Array,是需要新建的字段属性。
首先使用方法 checkTableExist() 检查表是否存在,随后获取默认值。(方法 checkTableExist() 在上一篇博客中已经分析过,在此不再赘述。随后获取默认值。)
若表存在,使用sql语句新建字段即刻。若表不存在,新建一个表并添加字段。新建表时,需要查询是否默认新增‘id主键’字段,随后按照要求新建表并添加字段。

async addField(_filed) {
    const table_exist = await this.checkTableExist(_filed.model_id);
    var def;
    var sql;
    var value = _filed.value;
    if (value === '') {
      def = '';
    } else if (think.isNumber(value) || think.isNumberString(value)) {
      def = ' DEFAULT ' + value;
    } else if (think.isString(value)) {
      def = `DEFAULT '${value}'`;
    } else {
      def = '';
    }

    if (table_exist) {
      const fie = _filed;
      sql = `ALTER TABLE \`${this.table_name}\` ADD COLUMN \`${fie.name}\`  ${fie.field}  ${def} COMMENT '${fie.title}';`;
      sql = this.parseSql(sql);
    } else { 
      const model_info = await this.model('model').where({id: _filed.model_id}).field('engine_type,need_pk').find();
      if (model_info.need_pk) {
        const fie = _filed;
        sql = ` CREATE TABLE IF NOT EXISTS \`${this.table_name}\` (
                \`id\`  int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键' ,
                \`${fie.name}\`  ${fie.field} ${def} COMMENT '${fie.title}' ,
                PRIMARY KEY (\`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 {
        const fie = _filed;
        sql = `  CREATE TABLE IF NOT EXISTS \`${this.table_name}\` (
                \`${fie.name}\`  ${fie.field} ${def} COMMENT '${fie.title}'
                )
                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;
  }

二、updateField()

此方法用于更新表字段。
此方法只有一个参数,类型为 Array,是需要更新的字段属性。
首先使用 checkTableExist() 方法检查表是否存在,若表存在,获取原字段名和默认值,使用sql语句更新字段即可。

async updateField(_field) {
    // 检查表是否存在
    await this.checkTableExist(_field.model_id);
    // 获取原字段名
    const last_field = await this.where({id: _field.id}).getField('name');
    // 获取默认值
    let def;
    var value = _field.value;
    if (value === '') {
      def = '';
    } else if (think.isNumber(value) || think.isNumberString(value)) {
      def = ' DEFAULT ' + value;
    } else if (think.isString(value)) {
      def = `DEFAULT '${value}'`;
    } else {
      def = '';
    }
    let sql = `ALTER TABLE \`${this.table_name}\` CHANGE COLUMN \`${last_field}\` \`${_field.name}\`  ${_field.field} ${def} COMMENT \'${_field.title}\' ;`;
    sql = this.parseSql(sql);
    const res = await this.model('mysql').execute(sql);
    return res == 0;
  }

三、deleteField()

此方法用于删除字段。
此方法只有一个参数,类型为 Array,是需要删除的字段属性。
首先使用 checkTableExist() 方法检查表是否存在。若表存在,使用sql语句删除字段即可。

async deleteField(_field) {
    // 检查表是否存在
    await this.checkTableExist(_field.model_id);

    let sql = `ALTER TABLE \`${this.table_name}\` DROP COLUMN \`${_field.name}\`;`;

    sql = this.parseSql(sql);
    // console.log(sql);
    const res = await this.model('mysql').execute(sql);
    return res == 0;
  }

四、checkName()

此方法用于检查同一张表是否有相同的字段。
此方法共有三个参数,第一个参数 name 为要验证的字段名称,第二个参数 model_id 为要验证的字段的模型id。
此方法返回值为一个布尔值。若存在相同字段,返回布尔值 true;若不存在相同字段,返回布尔值 false。

async checkName(name, model_id, id) {
    const map = {'name': name, 'model_id': model_id};
    if (!think.isEmpty(id)) {
      map.id = ['!=', id];
    }
    const res = await this.where(map).find();
    return think.isEmpty(res);
  }
上一篇:使用Linq 连接Datatble


下一篇:Golang批量更新数据进mysql数据库操作