Skip to content

❤ Node18-字典类型和字典数据优化

接下来我们针对字典部分进行一些必要的优化

1、数据参数命名

在项目的使用过程之中很多时候我们需要使用驼峰命名法利用工具或技术来自动将数据库中的 dict_type 字段转换为 dictType

方式一:使用Sequelize 模型定义中的字段别名

使用 Sequelize 作为 ORM(对象关系映射)工具来操作数据库,使用字段别名的功能,将数据库中的 dict_type 字段映射为 dictType 字段

javascript
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'
});

const Dictionary = sequelize.define('dictionary', {
  dict_type: {
    type: DataTypes.STRING,
    field: 'dict_type', // 数据库中的字段名
    allowNull: false
  },
  dictType: { // 定义模型中的字段别名
    type: DataTypes.STRING,
    field: 'dict_type', // 实际对应数据库中的字段名
    allowNull: false
  }
});

// 其他模型定义和数据操作...

module.exports = Dictionary;

方式二:直接使用数据库查询时的字段别名

javascript
SELECT dict_type AS dictType FROM your_table_name;

2、搜索参数优化

添加状态查询参数

类似这种状态我们如何增加筛查条件呢,这种参数其实跟我们正常状态一样

javascript

// 用户状态
if (status !== undefined && status !== '' && status !== null) {
    query += params.length ? ' AND' : ' WHERE';
    query += ' status = ?';
    params.push(status);
}

添加时间查询参数

使用 SQL 的 WHERE 子句来通过开始时间和结束时间查询 create_time 字段

在Sql语句之中,我们想要查询在某个时间范围内创建的数据,可以使用 BETWEEN 操作符或者 >=<= 操作符来指定开始时间和结束时间。

接下来我们先拿Sql语句试试,这里我们有两种方式可以尝试一下

javascript

第一种
SELECT * 
FROM sys_dict_type
WHERE create_time BETWEEN '2024-05-28 00:00:00' AND '2024-12-31 23:59:59';


第二种
SELECT * 
FROM sys_dict_type
WHERE create_time >= '2024-01-01 00:00:00' AND create_time <= '2024-12-31 23:59:59';

在Sql之中进行查询

接下来组合进入我们的查询条件之中,这里我们使用一下 >=<= 操作符

javascript
SELECT * FROM your_table WHERE create_time BETWEEN '2024-01-01 00:00:00' AND '2024-12-31 23:59:59';

把时间加入其中

javascript
 // 开始时间
    if (beginTime !== undefined && beginTime !== '' && beginTime !== null) {
        query += params.length ? ' AND' : ' WHERE';
        query += ` create_time >= ${beginTime}`;
        params.push(beginTime);
    }

      // 结束时间
    if (endTime !== undefined && endTime !== '' && endTime !== null) {
        query += params.length ? ' AND' : ' WHERE';
        query += ` create_time <= ${endTime}`;
        params.push(endTime);
    }

查询以后我们发现:

javascript
在node之sql的查询语句为SELECT * FROM sys_dict_type WHERE create_time >= 2024-05-15 00:00:06 AND create_time <= 2024-05-15 00:00:06 如何更改为SELECT * FROM sys_dict_type WHERE create_time >= 2024-05-15 00:00:06  AND create_time <= 2024-05-15 00:00:06

这个时候我们只能更改一下查询参数

javascript
开始时间更改为
query += ` create_time >= '${beginTime}'`;

结束时间更改为
query += ` create_time <= '${endTime}'`;

测试一下,我们的参数已经正常。

3、多参数优化

之前我们的搜索参数的筛查都十分简单粗暴,通过人为手动一个一个筛查的方式直接判断,我们以字典部分的参数为例(比如我们判断用户和年龄的时候采取的方式,那么当这种参数几十个甚至成千上百个呢?)

javascript
// 字典名称
if (dict_name !== undefined && dict_name !== '' && dict_name !== null) {
    query += ' WHERE dict_name = ?';
    params.push(dict_name);
}
// 字典类型
if (dict_type !== undefined && dict_type !== '' && dict_type !== null) {
    query += params.length ? ' AND' : ' WHERE';
    query += ' dict_type = ?';
    params.push(dict_type);
}

if (pageNum !== undefined && pageSize !== '' && pageSize !== null) {
    query += ' LIMIT ?, ?';
    let offset = (pageNum - 1) * pageSize;
    params.push(offset);

    params.push(parseInt(pageSize));
}

分析我们可以发现,其中存在着三种不同的判断,我们可以将其抽离出来,之后对其进行封装

第一个部分

普通条件进行抽离出来

javascript
// 普通条件
function addCondition(query, params, condition, value) {
    if (value !== undefined && value !== '' && value !== null) {
        query += params.length ? ' AND' : ' WHERE';
        query += ` ${condition} = ?`;
        params.push(value);
    }
    return query;
}


query = addCondition(query, params, 'dict_name', dict_name); // 字典名称
query = addCondition(query, params, 'dict_type', dict_type);  // 字典类型
query = addCondition(query, params, 'dict_label', dict_label); // 字典标签
query = addCondition(query, params, 'status', status);  // 状态

第二个部分

时间抽离出来

javascript
// 时间参数
function addDateRangeCondition(query, params, startTime, endTime) {
    if (startTime !== undefined && startTime !== '' && startTime !== null &&
        endTime !== undefined && endTime !== '' && endTime !== null) {
        query += params.length ? ' AND' : ' WHERE';
        query += ' create_time BETWEEN ? AND ?';
        params.push(startTime);
        params.push(endTime);
    }
    return query;
}

query = addDateRangeCondition(query, params, beginTime, endTime);

第三个部分

页码页条抽离出来

javascript
// 页码数和页条数
function addPagination(query, params, pageNum, pageSize) {
    if (pageNum !== undefined && pageSize !== '' && pageSize !== null) {
        query += ' LIMIT ?, ?';
        let offset = (pageNum - 1) * pageSize;
        params.push(offset);
        params.push(parseInt(pageSize));
    }
    return query;
}

query = addPagination(query, params, pageNum, pageSize);  //分页条件

封装进入其他的部分进行使用

这里需要格外注意,我们最好用这种方法进行导入和导出

javascript
module.exports = { addCondition, addDateRangeCondition, addPagination };
const { addCondition, addDateRangeCondition, addPagination } = require('./queryUtils.js');

通过各种分割和抽离代码,我们的代码才越简洁和美观!

Released under the MIT License.