Skip to content

JPwise-Web 最佳实践 - Claude Code

🎯 代码规范最佳实践

命名规范

javascript
// ✅ 好的命名
const userList = [];
const isLoading = false;
const handleUserSelect = () => {};

// ❌ 避免的命名  
const list1 = [];
const flag = false;
const doSth = () => {};

组件结构规范

vue
<template>
  <!-- 模板内容简洁,逻辑在 script 中处理 -->
</template>

<script>
// 导入顺序:第三方库 → 组件 → 工具函数
import { mapState } from 'vuex'
import CustomComponent from './CustomComponent'
import { formatDate } from '@/utils'

export default {
  name: 'PageName',  // 组件名称
  components: { CustomComponent },
  mixins: [listMixin],  // 必须使用项目 mixin
  data() {
    return {
      // 数据定义
    }
  },
  computed: {
    ...mapState(['user'])
  },
  methods: {
    // 方法定义
  }
}
</script>

🚀 性能优化最佳实践

列表页面优化

javascript
// ✅ 正确的列表配置
data() {
  return {
    listQuery: {
      currentPage: 1,
      pageSize: 20,        // 合理的分页大小
      sort: 'desc',
      sidx: 'CREATEDATE'
    },
    query: {
      $LK$NAME: '',        // 使用查询操作符
      $EQ$STATUS: ''
    }
  }
}

表单性能优化

javascript
// ✅ 使用 v-show 而不是 v-if(频繁切换)
<el-form-item v-show="showAdvanced" label="高级选项">

// ✅ 延迟加载大量选项数据
async loadOptions() {
  if (!this.optionsLoaded) {
    this.options = await api.getOptions();
    this.optionsLoaded = true;
  }
}

🔧 API 调用最佳实践

统一 API 调用模式

javascript
// ✅ 正确的 API 文件结构
import { doGet, doPost, doDelete } from '@/api/basic'

// 统一的方法命名
export function getList(data) {
  return doGet('/api/module/list', data)
}

export function saveData(data) {
  return doPost('/api/module/save', data)
}

export function deleteData(data) {
  return doDelete('/api/module/delete', data)
}

错误处理

javascript
// ✅ 统一错误处理
try {
  const result = await api.getData()
  // 处理成功结果
} catch (error) {
  console.error('API调用失败:', error)
  this.$message.error('操作失败,请重试')
}

🎨 界面交互最佳实践

弹窗使用规范

javascript
// ✅ 标准弹窗调用
openWindow({
  url: "views/basic/dynamicModel/list/Form",
  title: "数据编辑",
  width: "800px",
  data: {
    TmplCode: this.tmplCode,  // 确保有效
    formType: 2,              // 使用配置模式
    id: row.id                // 编辑时传 ID
  },
  onDestroy: {
    confirm: ({ data }) => {
      this.$message.success('操作成功')
      this.refresh()          // 刷新父页面
    }
  }
})

表单操作规范

javascript
// ✅ 表单脚本中的标准操作
// onLoad 事件
setFormData("FIELD_NAME", "默认值")
setShowOrHide("FIELD_NAME", true)
setRequired("FIELD_NAME", true)

// 根据权限控制显示
if (this.jnpf.hasFormP('FIELD_CODE')) {
  setShowOrHide("FIELD_NAME", true)
}

🔐 权限控制最佳实践

页面级权限

javascript
// ✅ 在 mixin 中统一处理
mixins: [btnPermission],

computed: {
  ...mapGetters(['buttonAuthList'])
}

字段级权限

javascript
// ✅ 表单字段权限控制
if (this.jnpf.hasFormP('SALARY_FIELD')) {
  setShowOrHide("SALARY", true)
} else {
  setShowOrHide("SALARY", false)
}

📱 响应式设计最佳实践

CSS 响应式写法

scss
// ✅ 移动端适配
.data-table {
  @media (max-width: 768px) {
    font-size: 12px;
    
    .el-table__cell {
      padding: 8px 4px;
    }
  }
}

组件适配

javascript
// ✅ 根据设备类型调整
computed: {
  isMobile() {
    return this.jnpf.isPC() === false
  }
},

data() {
  return {
    dialogWidth: this.isMobile ? '95%' : '800px'
  }
}

🔍 调试和测试最佳实践

开发环境调试

javascript
// ✅ 条件调试输出
if (process.env.NODE_ENV === 'development') {
  console.log('Debug Info:', {
    formData,
    userState,
    flowTaskInfo
  })
}

生产环境错误监控

javascript
// ✅ 全局错误处理
Vue.config.errorHandler = (err, vm, info) => {
  console.error('Vue Error:', err, info)
  // 发送到监控系统
}

📚 文档和注释最佳实践

组件文档

javascript
/**
 * 用户选择组件
 * @props {Array} value - 已选用户 ID 数组
 * @props {Boolean} multiple - 是否多选
 * @props {Array} ableIds - 可选用户 ID 范围
 * @emit {Function} input - 选择变化事件
 */
export default {
  name: 'UserSelect',
  // ...
}

复杂逻辑注释

javascript
// ✅ 关键业务逻辑加注释
// 根据流程状态判断字段是否可编辑
if (flowTaskInfo.thisStepCode === 'approval') {
  // 审批节点:只有审批人可以编辑审批意见
  setDisabled("APPROVAL_COMMENT", !isApprover)
}

🚦 Git 提交最佳实践

提交信息规范

bash
# ✅ 清晰的提交信息
git commit -m "feat: 添加用户权限管理功能"
git commit -m "fix: 修复列表分页显示问题"
git commit -m "refactor: 重构API调用逻辑"
git commit -m "docs: 更新组件使用文档"

提交前检查

bash
# 必须执行的检查
npm run lint        # 代码格式检查
npm run test:unit   # 单元测试
npm run build       # 构建验证

🎪 业务场景最佳实践

流程表单处理

javascript
// ✅ 流程表单标准处理
// onLoad 事件中
if (flowTaskInfo) {
  const { thisStepCode, taskOperates } = flowTaskInfo
  
  // 根据当前步骤设置字段状态
  if (thisStepCode === 'submit') {
    setRequired("REASON", true)
  } else if (thisStepCode === 'approval') {
    setShowOrHide("APPROVAL_SECTION", true)
  }
}

数据字典处理

javascript
// ✅ 标准枚举处理
// 在列表中显示
:formatter="jnpf.tableDicFormat"

// 在脚本中转换
const statusText = this.jnpf.getEnumText(statusCode, statusEnumList)

最佳实践核心:规范统一 + 性能优化 + 错误处理 + 可维护性