☕ 第十五章 综合项目:客户关系管理系统

15.6 本章小结

📄 一句话概括

第十五章收官——CRM 项目章五节走完(15.1~15.5)。这一章是全书十四部分知识的大练兵:没有引入一个新语法,全靠老朋友按"分工口诀"组队干活。本章也是 Java 基础系列的第 100 篇整——从 1.1 装 JDK 到今天,正好一百步。


一、五节串线:项目是怎么搭起来的

节 岗位 核心收获
15.1 项目开发准备 画图纸 开发四步(需求→设计→编码→测试)、三层类蓝图、分工口诀
15.2 用户登录 门卫值班 equals 双校验 + 常量打头防 null、三次机会两种骨架、boolean 方法封装
15.3 客户信息 造第一件货物 Customer 实体类:private + 官方通道 + 两种构造、两种造货路线
15.4 个人信息 照模板自造 User 实体类:同款封装模板换字段再套一遍、改密码 = equals 卡口 + 单个 set
15.5 登录管理 门卫转正 LoginManager 管理类:验证 + 日志 + 锁定三职责

主线一句话:先画图纸,再造货物,最后设管理——实体类(Customer/User)管数据,管理类(LoginManager)管业务,这个"两种角色"的套路,往后学的一切管理系统(包括后面的库房、集合版 CRM)全是它的重演。

二、概念速查 15 条

  1. 开发四步:需求分析 → 设计 → 编码 → 测试,先想清楚再动手
  2. CRM:客户关系管理系统 = 销售员的小本本
  3. 三层类蓝图:CustomerView 脸 / CustomerList 库房 / Customer 货物 + CMUtility 打字员
  4. 分工口诀:脸管喊话,库管货,实体管数据,工具管打字
  5. 数据只走官方通道:private 字段 + getter/setter,View 不许越级摸数组
  6. equals 双校验:比较内容不比地址(6.2)+ 常量打头防 null 空针
  7. 三次机会两种骨架:for 倒序 i=2;i>=0 / while + 计数器
  8. 两种造货路线:无参 + 逐项 set(改货专用)/ 全参一步到位
  9. 写了全参必补无参:编译器白送的在手写带参那一刻就没了
  10. 实体类 vs 管理类:实体装一个对象的数据,管理装一群对象的业务逻辑
  11. 心法:数据跟实体走,逻辑跟管理走
  12. 锁定卡口:连错 3 次拉闸,卡口放在验证前面
  13. 成功先清零:登录成功 failCount = 0,计数器状态是管理类的命根
  14. 登录日志三记三不记:记谁、何时、成败;不记密码、不打明文、不混业务
  15. 扩容钩子:数组满了要防御,双倍 arraycopy 搬家——7 章 ArrayList 的内部戏码

三、代码模板 4 段

模板 1:实体类骨架(背下来,一类一份)

public class 实体名 {
    private 字段一;  private 字段二;  // 全 private
    public 实体名(全参) { this.字段 = 参数; ... }   // 全参构造
    public 实体名() { }                            // 无参构造(必补)
    public 类型 getXxx() { return xxx; }           // 官方通道一式 N 份
    public void setXxx(类型 x) { this.xxx = x; }   // 可加安检 throw
    public String show() { return 一行自我介绍; }
}

模板 2:登录校验(equals + 常量打头 + 三次机会)

for (int i = 2; i >= 0; i--) {
    if ("admin".equals(name) && "123456".equals(pwd)) { return true; }
    System.out.println("错了!还剩 " + i + " 次");
}
return false;

模板 3:管理类验证骨架(卡口 → 找人 → 分诊)

if (locked) { return false; }                        // 卡口第一
for (int i = 0; i < size; i++) {
    if (accounts[i].getUsername().equals(name)) {
        if (accounts[i].getPassword().equals(pwd)) {
            failCount = 0;                           // 先清零再放行
            return true;
        }
        failCount++; if (failCount >= 3) locked = true;
        return false;
    }
}
return false;                                        // 查无此人

模板 4:数组防御(add 前必查)

if (userIndex >= accounts.length) { /* 报错或扩容 */ }

四、本章五大名坑

⚠️ 坑 1:用 == 比字符串

15.2 现场翻车:键盘输入的字符串和字面量不同址,输对了也报错。铁律:字符串比较只用 equals,且常量打头。

⚠️ 坑 2:写了全参构造不补无参

15.3 实验 3 现场翻车:new 实体名() 直接编译报错。写带参构造的手起,补无参构造的落。

⚠️ 坑 3:业务写进实体类

实体类一沾登录校验/客户管理,分层散架变"大杂烩"。实体只装数据,业务归管理类和 View。

⚠️ 坑 4:锁定卡口放验证后面 / 成功不清零

卡口在后,锁定的人输对密码照样进;成功不清零,改对密码也进不去。秩序在前,记账要清。

⚠️ 坑 5:日志记密码 / show() 打明文

调试图方便,事故一瞬间。敏感字段打码是习惯,不是选项。

五、收官暗线:项目没有新知识

把五节拆开看,全是老朋友上岗:

结论:所谓"综合项目",就是把散装的知识点按分工组装成一台能跑的机器。能力增长的不是新知识,是组装能力——这正是项目章存在的意义。

六、跨章连线:这一百步都路过哪

七、毕业大题 + 自检

毕业大题:门禁小系统(本章所有零件合体)

要求:① LoginManager 管两个以上 User 账号;② 登录三次机会 + 连错 3 次锁定 + 成功打印日志(不记密码);③ 登录成功进入"主菜单"占位(打印 1-修改密码 2-退出,switch 实现);④ 修改密码走 equals 验旧 + set 新,改完重新登录生效。写完在纸上画出"数据分别存在哪个类的哪个字段里"。

❓ 自检 6 项(全过才算毕业)
  1. 能默写实体类五件套(private/全参/无参/getset/show)吗?
  2. 能说出 equals 两条规矩(比内容、常量打头)并解释为什么吗?
  3. 两种造货路线各自用在什么场景?
  4. 实体类和管理类的区别,能用"数据跟实体走,逻辑跟管理走"讲明白吗?
  5. 锁定卡口为什么在验证前面?成功后为什么先清零?
  6. 数组 add 为什么必须先防御?扩容怎么做?

八、下一步学什么


相关笔记