2022-03-30 前端沙龙

一:逻辑校验 (避免上线bug、出现bug快速定位问题)

在进行逻辑校验时一定要注意数据类型、数据有无值,特别是接口返回数据处理逻辑要非常注意。
- 开发时因为数据都是想要的,所以不会报错,但是生产数据是千变万化的

getTableData(record: any) {
    // 例子
   ajax({ regId: record.regId })
      .then(data => {
        this.reportInfo = data;
        this.reportInfo.processStatus = record.processStatus;
      })
      .catch(error => {
      });
  }
getPatData(record: any) {
    // 严谨示例
   ajax({ regId: record.regId })
      .then(data => {
        // data有值但字段不全、或者直接为空
        if(data?.fields?.processStatus){
          this.reportInfo.processStatus = data.fields.processStatus;
        }else{
          message.error('请求患者信息内无processStatus值,可能会影响部分功能')
        }
        if(data && Object.keys(data).length > 0 && !!data.registraId){ // data === {} 不可信
          this.reportInfo = data;
        }else{
          message.error('请求患者信息内无registraId值,请重试')
          this.getPatData(record) // 可以自己再调用一遍,注意写各count限制请求次数
        }
      })
      .catch(error => {
          message.error('获取患者信息失败:'+error)
      });
  }

async init(record: any) {
  const aaaa= await this.getPatientInfoById(record.id);
  if (!aaaa) { return false; }
  await this.getModalityData();
  const bbbb= await this.getDeptConfig();
  const cccc= await this.getDeptCAConfig(bbbb);
  record.userRole = cccc
  const dddd= await hospitalHttp.getHospitalList('');
  if (!!dddd) {
  }
  await this.getLockReport(record)
}
常规写法:if(data && data.menuData && data.menuData.fields && data.menuData.fields.obj && data.menuData.fields.obj.name){}
?简易写法:if(data.menuData?.fields?.obj?.name){}
   if (Number(this.menuData.patTypeId) === 2) { // 住院病历
     this.visibleEmr = true
   }

   <a-checkbox v-if="activeType.toString() === '1'" :checked="importRdcIsContune">提交审核</a-checkbox>
  • 严谨代码虽然看似多了不少代码量,前端也无法保证接口数据正确与否,但是一旦出问题会
    1、把问题直接抛出不会让使用者后知后觉
    2、方便开发者定位问题
    3、多个请求同步执行时,如果不严格判断数据存在与否,会造成定位bug非常困难

二、组件化开发

  • vue框架两大特性:数据驱动、组件化
    组件化的初衷是把一个系统内多地通用的功能抽离,然后进行复用,提高开发速度、方便后续维护
    而不是当需要减少代码量的时候就抽为组件
  <a-select v-model="patTypeId"  placeholder="选择类型" >
    <a-select-option v-for="item in patTypes" :key="item.value" :value="item.value">{{item.name}}
    </a-select-option>
  </a-select>
   // 患者类型
    patTypes: any = [
      { value: '', name: '病人来源' },
      { value: '1', name: '门诊' },
      { value: '2', name: '住院' },
      { value: '3', name: '体检' }
    ];
  • 比如科室、模态 ... 等还需要请求接口获取
  • 封装示例:
<template>
  <el-select
    v-model='s_value'
    multiple
    filterable
    remote
    placeholder='请选择科室'
    @change="$emit('change')"
    :loading='loading'>
    <el-option
      v-for='item in list'
      :key='item.value'
      :label='item.label'
      :value='item.value'>
    </el-option>
  </el-select>
</template>

<script>
import { getDeptData } from "@/api/index";
  export default {
    data() {
      return {
        loading: false,
        list: [],
      }
    },
    props:{
      value:{ type:Array,default: ()=>[],required:true}, // v-model 双向绑定
      hosid:{ type:String,default: '',required:true}
    },
    computed: {
      s_value: { // v-model 双向绑定
        get() {
          return [...this.value]
        },
        set(val) {
          this.$emit('input', [...val])
        }
      }
    },
    mounted() {
        this.loading = true
        let query = {
            hosid:this.hosid
        }
        getDeptData(query)
        .then((res)={
            if(res && res.length){
              this.list = list
              }else{
                this.$message.warning('获取科室数据失败')
            }
        }).catch((err)={
           this.$message.warning('获取科室数据失败'+err)
        }).finally(()=>{
            this.loading = false
        })
    }
    }

使用时:
import elPacsDeptSelect from '@/components/elPacsDeptSelect.vue';

<el-pacs-deptSelect v-model="patTypeId"  placeholder="选择科室" @change=""/>
  • 日常开发中可复用的,以pacs为例:科室、模态、患者类型、部位树、表格、右键菜单...
    组件化:重复性工作一劳永逸、方便维护
    近期pacs的编辑器、滚动加载表格、右键菜单 会封装为公用组件。之前功能找机会慢慢替换

公用方法抽离:


/**
 * 防抖函数
 * @param fn
 * @param time
 */
export function debounce(fn, time = 50) {
  let timer = null
  return function(...args) {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, args)
    }, time)
  }
}

export function checkNull (str) {
  if (str === null) {
    return true
  }
  if (str == "") {
    return true
  }
  if (str == "undefined") {
    return true
  }
  var regu = "^[ ]+$"
  var re = new RegExp(regu)
  return re.test(str)
}
// main.js
import {  checkNull, debounce } from '@/util/util.js'
Vue.prototype.$checkNull = checkNull
Vue.prototype.$debounce = debounce 
// 使用:
if(!this.$checkNull(val)){     }
searchItem:this.$debounce(function(val) {
// 业务逻辑
},200)

三、页面样式、操作逻辑、功能排版保持严谨

问题:领导评审的时候看的是什么?
问题:客户重复性工作用户体验来源于什么?

image.png

要求提测代码时不该滚动的区域不滚动、该对齐的对齐...,不遵循的话可能会不允许你提测~~///(^v^)\~~
vue中监听dom尺寸变化库推荐:
element-resize-detector : https://www.npmjs.com/package/element-resize-detector

四、数据计算不可在前端出错

import Decimal from 'decimal.js';
togglePrice = new Decimal(togglePrice).add(new Decimal(data.amount))
// 经典的0.1 +0.2 = 0.3
0.3 - 0.1                     // 0.19999999999999998
x = new Decimal(0.3)
x.minus(0.1)                  // '0.2'
x                             // '0.3'

五、代码分支、提交规范

写法示例:
[feat] 报告列表、就诊列表、登记列表新增锁定标识、解锁弹窗功能
[update] 审核报告提示信息优化
[fix] pacs登记列表刷新页面后报获取列表配置失败提示修复
- 目前执行情况略差

六、库的使用

  • 特别是UI组件库不要乱用,实在想用先看看gitlab上的start数量,因为不成熟没有经过大量用户验证的库,维护和扩展性比较差,一旦用了中后期进退两难
  • 推荐只使用element-ui和纯手写

七、对自己的产出负责、多自测

image.png
  • 开发环境、测试环境都要测试,避免出现改了bug造了新bug的情况

七、写好备注、一个方法代码函数严格控制不超过150行

  • 利于后续修改维护、减少在不了解业务的前提下,改一处bug新增一处bug
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容