• 代码优化记录


    emmm 在这家公司的话,比较好的就是每次写完的代码都有三个人review,对代码优化有一定的提升还有一些小的知识点,就此记录下来,这篇博客会持续更新
    2020/07/06

    知识点:
    1 element ui 的 DatePicker组件,如果后台需要时间戳的话,可以直接用时间value-format设置timestamp来显示, 但是这里的话如果需要写默认值的话,一定也是传入的时间戳的格式才可以
    2 将时间戳毫秒转化为秒的时候,应该加上Math.round()这样的话不会有三位小数点 Math.round(new Date(date).getTime() / 1000)
    3.在你提交代码前应该去vscode的那个changes看看这一次改了什么,最好就是提交完commit也再看一次
    4.接口的返回code的判断一般全局都有,不需要自己的判断
    5.顶级菜单的meta里面的code,是子集的合成code,不用单独写
    下面是基于egg.js的node开发,用sequelize做与数据库通讯的桥梁
    6.如果node不采用读表,直接从后台的接口中转的话,应该进行一个错误的抛出

       if (res.status !== 200 || (res.data.code && res.data.code !== 0)) {
          ctx.throw(res.status, res.data.msg, { ...res.data })
        }
    

    7.使用sequelize进行排序,不是去用sort去排序,这样没法去解决页数的问题,order: [[ 'updated_at', 'DESC' ]],

    async versionManage({ limit, offset }) {
        const { rows, count } = await this.ctx.model.HxVersions.findAndCountAll({
          attributes: { exclude: [ 'createdAt', 'updatedAt' ] },
          order: [[ 'updated_at', 'DESC' ]],
          offset,
          limit,
        })
        return { list: rows, total: count }
      }
    
    

    8 关于map的使用
    拒绝:

    list.map(item => {
       return xxxx
    })
    

    接受

    const data = list.map(item => {
       return xxxx
    })
    

    map的设计思想,就是保持原数组不变,所以在map里,不建议直接修改源item,而是声明一个新的临时item,处理完后return这个新的item; 2,map处理的结果,建议用一个变量存储起来再使用
    如果不需要数据返回直接操作,可以用forEach
    9导出的功能是不需要做分页的操作的,是导出全部的数据
    10 ctx.curl的使用不需要拼接参数,应该直接用data传过去

    ctx.curl('xxx', {
      dataType: 'json',
      data: query,
    })
    

    11 有两个表,第一个接口:如果a表是主表,需要连接多个表,其中有个是b表,另一个接口,b表是主表,需要连接多个,其中有个是a表,那么这时候在model里面不需要做2次关联,直接1次关联,然后直接在service里面的include去用这个关联名字就可以了,例如:

    this.belongsTo(app.model.HxUser, { foreignKey: 'userId', targetKey: 'userId', as: 'basic' })
    
    this.hasOne(app.model.HxUserBaseInfo, { foreignKey: 'userId', sourceKey: 'userId', as: 'basic' })
    

    只用在这里用basic去关联就好了

    async baseInfoById(userId) {
        const { rows } = await this.ctx.model.xxxxxxx.findAndCountAll({
          attributes: { exclude: [ 'createdAt', 'updatedAt' ] },
          where: {
            userId,
          },
          include: [
            {
              model: this.app.model.HxUser,
              as: 'basic',
            },
          ],
        })
        return { list: rows }
      }
    }
    
    

    12 从外部引入的依赖,统一写在模块的顶部,例如:

    const Excel = require('exceljs')
    

    代码写法优化:
    1.去掉多余的代码,像这里div就可以去掉了

         <template #triggerTime="{ scope }">
            <div>
              {{ parseTime(scope.row.triggerTime) }}
            </div>
          </template>
    

    2.有两处复用到的方法一定要抽到utils里面

      function test() {
          return list.filter((item) => {
            return item.prop !== 'record'  
          }) 
        }
    

    改成

     function test() {
        return list.filter(item => item.prop !== 'record')
     }
    

    箭头函数后面不是块体的话,不用return, 在一个简写体中,只需要一个表达式,并附加一个隐式的返回值。在块体中,必须使用明确的return语句
    箭头 后面就是返回值,但是碰到{}就当作函数的代码块执行并需要在函数代码块里面手动返回,其他的表达式全都是直接返回的
    3.代码要使用JSDoc 格式注释
    4.不建议通过下标获取某个数据,这样如果有加数据的话,以后变数很大
    5.如果有几个相同的方法,类似于取消封禁,封禁等等,应该写到一个方法里面
    下面是基于egg.js的node开发,用sequelize做与数据库通讯的桥梁
    6 更新数据,用一个方法就好,要减少与数据库的交互,她写两份的目的是为了保险,怕id不存在更新不了, 不用考虑这个情况

     async editGameSubmit({ id, body }) {
        const gameModel = await this.ctx.model.HxGameGames.findAll({
          where: {
            id,
          },
        })
        return await gameModel[0].update({ ...body })
      }
    

    改成

    async editGameSubmit(id, body) {
      return await this.ctx.model.HxGameGames.update(
        { ...body },
        { where: { id } },
      )
    }
    

    7 去掉调试的打印
    8.如果有一些数组的处理的时候,如果没有值,可以直接给一个默认值传到组件,
    例如:

       const baseExcelInfo = {
          data: list,
          filename: 'userlist',
          header: this.header,
          sheetName: 'sheet1',
          imageKeys: [{
            name: 'userAvator',
            imgWidth: '100',
            imgHeight: '100',
          },
          ],
        }
        await service.common.exportFile.exportExcel(baseExcelInfo)
    
    async exportExcel({
        data = [],
        filename = 'file',
        header,
        sheetName = 'sheet1',
        imageKeys = [],
        creator = 'me',
        lastModifiedBy = 'her',
      }) { 
      // do something
    }
    

    imageKeys这里就应该给一个空数组的默认值
    9. 上边的const { app } = this,这个变量app,在下边只用了一次,就没必要单独声明了,直接用this.app访问就行了。
    如果箭头函数的函数体,只有一个return,就不用写return语句了,直接在箭头后边,跟上要返回的内容,就行了

  • 相关阅读:
    code light
    asp.net(C#)定时自动发送邮件
    示例代码(一)
    devExpress 7.2.5
    使用VSIUAL C#.NET操作Excel -把DataTable中的数据写入Excel
    C#日期格式化的几种处理方法
    配置
    关于Windows 2008 R2 Web服务器环境搭建、安全流程
    安全
    FTP 用户目录病隔离
  • 原文地址:https://www.cnblogs.com/antyhouse/p/13253431.html
Copyright © 2020-2023  润新知