CRM一张表单开发的思路

ops/2025/3/6 13:23:47/

在开发CRM项目的这几个星期里,我遇到了不少困难,最大的困难是对开发一张表单的完整流程缺乏清晰的思路。回想起开发第一张表单时,我完全处于照抄的状态。当时,我负责的是正式客户申请单,而泓宇开发的潜在客户申请单和我的任务非常相似,所以我基本上是照着他的表单一步步模仿,迷迷糊糊地就完成了第一张表单。

然而,问题出现在第二张表单——客户档案表单的开发上。因为没有可以直接参考的模板,我花了整整两个星期,依然没有搞定这张表单。那段时间真的很痛苦,几乎每天都感觉漫无目的,不知道自己在做什么。为了完成任务,我随便找其他表单东抄一点、西抄一点,但最终一团糟,什么成果也没做出来。

后来有一天我实在是受不了了,我记得那天是星期六,我和我同学聊了一通电话,聊了之后又想了一天东西。那天,我明白了,我一直做不出表单的关键在于我连最基本的需求都没有搞清楚。如果你开发一张表单,却连这张表单的需求是什么、最终需要实现什么功能都不清楚,那肯定是无从下手的。因此,我认识到第一步一定是明确需求,搞清楚这张表单的目标是什么、想要实现哪些功能。这一步至关重要。

当需求明确后,就可以进入第二步——梳理表单的开发思路,也就是规划好完成这张表单需要哪些步骤。这一步完成后,其实心里就已经有了很大的底,因为接下来的工作就是按照这些步骤,用代码将它们逐一实现。

前面两步是很重要的,但是我在上篇文章已经讲过了这两步的重要性了。所以今天,我们重点来聊聊如何在代码实现的过程中关注细节。

我们先从后端的开发流程开始讲解。

1. 判断表单是否有表体

如果这张表单没有表体,那么直接使用普通的 controllerservicerepositorymapper 和 mapper 的装饰器就可以完成开发,这种情况下只需要一条主线即可。如果表单有表体,但表体不需要单独进行增删改查操作,那么也不用额外开一条线,依然可以复用主表的那条线。

明确了需要开几条线后,下一步就是开始编写代码。


2. 编写代码:重点在 DTO 和 Entity

后端开发中,真正需要你手动编写的部分主要是 DTO 和 Entity,其他部分基本上是可以直接复用或照抄的。由于每张表单的字段各不相同,DTO 和 Entity 的定义也会随之变化。这里,字段设计是最关键的部分,因为表单的字段不仅仅是简单的 String 或 int 类型,还可能包含复杂的类型,比如参照字段和下拉框字段。不同类型的字段需要不同的处理方式。


3. 字段处理:常见类型

以下是一些常见字段的处理方式:

(1)billCode 字段

billCode 是每张表单的必备字段,必须要有。

(2)state 状态字段

state 状态字段是否需要添加,取决于具体的业务需求。尽管业务给出的字段列表中可能没有这个字段,但你需要根据表单的业务场景判断是否需要补充。例如,某些表单可能需要状态字段来标识流程状态(如自由态、审核中、审核通过等)。


4. 参照字段的处理

以“客户”参照字段为例,说明如何处理参照字段。

表单的三个页面

一张表单通常包含三个页面:列表页编辑页 和 详情页

  • 列表页和详情页用于展示数据。
  • 编辑页用于填写数据并将字段数据保存到数据库。
参照字段的逻辑

在编辑页中,当你选择了“客户名称”时,本质上你选择的是 customerId。当点击“保存”时,前端会将 customerId 传递到后端。因此,后端的 DTO 中需要定义一个 customerId 字段来接收这个值。

然而,在数据库中,存储的字段可能是 customer,而不是 customerId。为了实现从 DTO 到 Entity 的转换,我们需要在 mapper 中编写转换逻辑,将 DTO 中的 customerId 转换为 Entity 中的 customer

实现步骤
DTO 的字段设计

  1. DTO 中需要定义 customerId 和 customerName 两个字段。
  2. customerId 用于接收前端传递的客户 ID。
  3. customerName 用于展示客户名称。

从 DTO 到 Entity 的转换

在 mapper 中,编写转换逻辑,将 customerId 转换为 customer 并存储到数据库中。

从 Entity 到 DTO 的转换


在 Entity 中,通过标注实现数据的关联。例如,customer 字段可以通过 CustomerExtApi 方法查找到客户表中的 customerId 和 customerName,并将这两个字段传递到 DTO 中

通过以上流程,后端可以完成对参照字段的处理。


5. 下拉框字段的处理

下拉框字段的处理逻辑与参照字段类似,但稍有不同。

本质

下拉框在前端展示的是具体的文本数据(如“自由态”“审核中”“审核通过”“审核不通过”),但在数据库中存储的却是对应的数值(如 0123)。因此,需要在前后端之间进行数据的转换。

转换方式

转换可以通过以下两种方式实现:

  1. 前端转换
    前端根据数值(如 0123)动态显示对应的文本数据。

  2. 后端转换
    后端接收数值后,通过代码将其转换为对应的文本数据,再返回给前端

CRM 系统中的处理

在 CRM 系统中,这种转换通常是通过系统配置完成的。例如,对于审批状态字段:

  • 数据库中存储的值为 0123
  • 系统配置中定义了数值与文本的对应关系:
    • 0 对应“自由态”。
    • 1 对应“审核中”。
    • 2 对应“审核通过”。
    • 3 对应“审核不通过”。

通过这种配置,系统可以自动完成数据的转换,开发者无需手动编写转换逻辑。你只需要做的就是在前端的某个文件里面自定义枚举,就完事儿了,就像下面这样。

其实这是很方便的,不用程序员手动编写转换逻辑,但是这个叼系统不知道为什么即使我加了枚举,配置的时候下拉没有显示我的自定义的枚举,所以我还要手动去数据库中配置一下才行。

这个字段要手动加上approvestatus,这样系统就会自动你配置的这个枚举标识了,不然找不到,我也不知道为什么。

其实,表单的字段类型无非就几种:最基本的 StringintBigDecimalfloat,再加上稍微复杂一点的参照字段和下拉框字段。只要把这些类型处理清楚,基本上就没什么问题了。


6. 基本文件的准备

当 DTO 和 Entity 都定义好了之后,下一步就是准备数据库。数据库表结构设计好、创建完成后,就可以继续往下推进。

接下来需要确认是否需要写接口。如果不需要写接口,那后端的工作基本就完成了;如果需要写接口,那就把接口写好。接口写完后,后端的代码基本上就差不多了。


7. 用 Postman 测试

写完后端代码后,必须用 Postman 进行测试。这一步非常重要,因为如果不测试,你无法确认写的接口是否正确。例如:

  • 如果接口逻辑有问题,可能会导致数据无法正确返回。
  • 即使在 CRM 项目中不需要写接口,也可以通过 Postman 测试来验证 DTO 和 Entity 的数据转换是否正确。

总之,Postman 测试是后端开发中不可缺少的一环,确保接口逻辑和数据处理没有问题后,才能继续下一步。


8. 前端的开发

测试完后端接口后,就可以开始处理前端部分了。不过,这个 CRM 系统和其他系统有些不同,前端不需要写代码。前端的页面是固定的模板,类似一个写死的页面雏形,直接拿来用就可以了。

前端的开发流程
  1. 找到一个合适的页面模板。
  2. 将模板搬过来,根据需求稍作修改即可。

前端的开发几乎没有技术难度,关键在于系统配置


9. 系统配置

系统配置是整个流程中比较特殊的一部分。一开始可能会觉得配置很复杂,但熟悉之后就会发现,这其实就是流水线式的工作。只要按照步骤逐一完成,就不会有什么难点。


10. 最终测试

当所有步骤都完成后,最后一步就是自己手动操作一下表单,检查增删改查功能是否正常。如果没有问题,这张表单的开发就算彻底完成了。


http://www.ppmy.cn/ops/163606.html

相关文章

linux上redis升级

linux上redis升级 redis版本升级。 我原本的redis 版本是6.2.1,现在就对他做一下升级处理。 1、下载redis 源码包: redis 下载地址 根据下载地址选择自己要安装的redis 版本的源码包。这里我下载的是 redis-6.2.6.tar.gz。 这里你可以先下载到本地&am…

玩转大模型——Trae AI IDE国内版使用教程

文章目录 Trae AI IDE完备的 IDE 功能强大的 AI 助手 安装 Trae 并完成初始设置管理项目什么是 “工作空间”?创建项目 管理插件安装插件从 Trae 的插件市场安装从 VS Code 的插件市场安装 禁用插件卸载插件插件常见问题暂不支持安装 VS Code 插件市场中某个版本的插…

【零基础C语言】第四节 数组

【零基础C语言系列】 【零基础C语言】第一节 C语言概述【数制进制码制】-CSDN博客 【零基础C语言】第二节 数据类型、运算符、表达式-CSDN博客 【零基础C语言】第三节 控制结构-CSDN博客 一、一维数组

为何在用户注销时使用 location.href 而非 Vue Router 的 router.push

在开发 Web 应用时,用户注销功能的设计看似简单,但背后隐藏着对状态管理、安全性和用户体验的深层考量。以下将详细探讨为何许多项目在注销跳转时选择 location.href(强制刷新页面)而非 Vue Router 的 router.push(单页…

知识篇 | 低代码开发(Low-Code Development)是个什么东东?

一、低代码的起源与历史背景 低代码开发的核心理念可以追溯到上世纪80年代的第四代编程语言(4GL)和快速应用开发工具(RAD),例如PowerBuilder和Visual Basic。这些工具通过图形化界面简化了开发流程,但受限于…

机器学习中的MATLAB探索:从理论到实践

1. 机器学习基础与核心概念 1.1 机器学习的分类对比 下表总结了监督学习、无监督学习与强化学习的核心区别: 特征监督学习无监督学习强化学习数据需求带标签数据无标签数据环境交互的动态数据目标预测输出(分类/回归)发现数据内在结构&…

P8692 [蓝桥杯 2019 国 C] 数正方形--输出取模余数

P8692 [蓝桥杯 2019 国 C] 数正方形 题目 解析代码 题目 解析 这是数学题 T^T 不过对于这种题目都说了结果非常大的题,得开long long【不开long long 见ZZ】 然后还有点要说的就是,为了缩减计算量,这种要求结果输出模后余数的题&#xff0…

ZStack环境搭建(个人练习)

1、登陆平台 ①以租户的方式登录平台(网址)创建云主机,部署ZStack_Cloud. ②账号:2025-姓名(中文) 密码:password ③以ZStack iso默认规格创建云主机 计算规格:8C24G 镜像ZSta…