Node-字典类型和字典数据优化

举报
林太白 发表于 2024/11/29 14:31:46 2024/11/29
【摘要】 Node-字典类型和字典数据优化

Node-字典类型和字典数据优化

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

1、数据参数命名

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

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

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


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、搜索参数优化

添加状态查询参数


状态:
正常 0
禁用 1

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



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

添加时间查询参数

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

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

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



第一种
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之中进行查询

nodezidiany-1.png

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

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}'`;

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

nodezidiany-2.png

nodezidiany-3.png

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));
}

nodezidiany-4.png

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

第一个部分

普通条件进行抽离出来

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');

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。